Instantly share code, notes, and snippets.

Embed
What would you like to do?
Note: This script has been moved to https://github.com/tmplinshi/KeypressOSD
; KeypressOSD.ahk
;--------------------------------------------------------------------------------------------------------------------------
; ChangeLog : v2.22 (2017-02-25) - Now pressing same combination keys continuously more than 2 times,
; for example press Ctrl+V 3 times, will displayed as "Ctrl + v (3)"
; v2.21 (2017-02-24) - Fixed LWin/RWin not poping up start menu
; v2.20 (2017-02-24) - Added displaying continuous-pressed combination keys.
; e.g.: With CTRL key held down, pressing K and U continuously will shown as "Ctrl + k, u"
; v2.10 (2017-01-22) - Added ShowStickyModKeyCount option
; v2.09 (2017-01-22) - Added ShowModifierKeyCount option
; v2.08 (2017-01-19) - Fixed a bug
; v2.07 (2017-01-19) - Added ShowSingleModifierKey option (default is True)
; v2.06 (2016-11-23) - Added more keys. Thanks to SashaChernykh.
; v2.05 (2016-10-01) - Fixed not detecting "Ctrl + ScrollLock/NumLock/Pause". Thanks to lexikos.
; v2.04 (2016-10-01) - Added NumpadDot and AppsKey
; v2.03 (2016-09-17) - Added displaying "Double-Click" of the left mouse button.
; v2.02 (2016-09-16) - Added displaying mouse button, and 3 settings (ShowMouseButton, FontSize, GuiHeight)
; v2.01 (2016-09-11) - Display non english keyboard layout characters when combine with modifer keys.
; v2.00 (2016-09-01) - Removed the "Fade out" effect because of its buggy.
; - Added support for non english keyboard layout.
; - Added GuiPosition setting.
; v1.00 (2013-10-11) - First release.
;--------------------------------------------------------------------------------------------------------------------------
#SingleInstance force
#NoEnv
SetBatchLines, -1
ListLines, Off
; Settings
global TransN := 200 ; 0~255
global ShowSingleKey := True
global ShowMouseButton := True
global ShowSingleModifierKey := True
global ShowModifierKeyCount := true
global ShowStickyModKeyCount := false
global DisplayTime := 2000 ; In milliseconds
global GuiPosition := "Bottom" ; Top or Bottom
global FontSize := 50
global GuiHeight := 115
CreateGUI()
CreateHotkey()
return
OnKeyPressed:
try {
key := GetKeyStr()
ShowHotkey(key)
SetTimer, HideGUI, % -1 * DisplayTime
}
return
OnKeyUp:
return
_OnKeyUp:
tickcount_start := A_TickCount
return
; ===================================================================================
CreateGUI() {
global
Gui, +AlwaysOnTop -Caption +Owner +LastFound +E0x20
Gui, Margin, 0, 0
Gui, Color, Black
Gui, Font, cWhite s%FontSize% bold, Arial
Gui, Add, Text, vHotkeyText Center y20
WinSet, Transparent, %TransN%
}
CreateHotkey() {
Loop, 95
{
k := Chr(A_Index + 31)
k := (k = " ") ? "Space" : k
Hotkey, % "~*" k, OnKeyPressed
Hotkey, % "~*" k " Up", _OnKeyUp
}
Loop, 24 ; F1-F24
{
Hotkey, % "~*F" A_Index, OnKeyPressed
Hotkey, % "~*F" A_Index " Up", _OnKeyUp
}
Loop, 10 ; Numpad0 - Numpad9
{
Hotkey, % "~*Numpad" A_Index - 1, OnKeyPressed
Hotkey, % "~*Numpad" A_Index - 1 " Up", _OnKeyUp
}
Otherkeys := "WheelDown|WheelUp|WheelLeft|WheelRight|XButton1|XButton2|Browser_Forward|Browser_Back|Browser_Refresh|Browser_Stop|Browser_Search|Browser_Favorites|Browser_Home|Volume_Mute|Volume_Down|Volume_Up|Media_Next|Media_Prev|Media_Stop|Media_Play_Pause|Launch_Mail|Launch_Media|Launch_App1|Launch_App2|Help|Sleep|PrintScreen|CtrlBreak|Break|AppsKey|NumpadDot|NumpadDiv|NumpadMult|NumpadAdd|NumpadSub|NumpadEnter|Tab|Enter|Esc|BackSpace"
. "|Del|Insert|Home|End|PgUp|PgDn|Up|Down|Left|Right|ScrollLock|CapsLock|NumLock|Pause|sc145|sc146|sc046|sc123"
Loop, parse, Otherkeys, |
{
Hotkey, % "~*" A_LoopField, OnKeyPressed
Hotkey, % "~*" A_LoopField " Up", _OnKeyUp
}
If ShowMouseButton {
Loop, Parse, % "LButton|MButton|RButton", |
Hotkey, % "~*" A_LoopField, OnKeyPressed
}
for i, mod in ["Ctrl", "Shift", "Alt"] {
Hotkey, % "~*" mod, OnKeyPressed
Hotkey, % "~*" mod " Up", OnKeyUp
}
for i, mod in ["LWin", "RWin"]
Hotkey, % "~*" mod, OnKeyPressed
}
ShowHotkey(HotkeyStr) {
WinGetPos, ActWin_X, ActWin_Y, ActWin_W, ActWin_H, A
if !ActWin_W
throw
text_w := (ActWin_W > A_ScreenWidth) ? A_ScreenWidth : ActWin_W
GuiControl, , HotkeyText, %HotkeyStr%
GuiControl, Move, HotkeyText, w%text_w% Center
if (GuiPosition = "Top")
gui_y := ActWin_Y
else
gui_y := (ActWin_Y+ActWin_H) - 115 - 50
Gui, Show, NoActivate x%ActWin_X% y%gui_y% h%GuiHeight% w%text_w%
}
GetKeyStr() {
static modifiers := ["Ctrl", "Shift", "Alt", "LWin", "RWin"]
static repeatCount := 1
for i, mod in modifiers {
if GetKeyState(mod)
prefix .= mod " + "
}
if (!prefix && !ShowSingleKey)
throw
key := SubStr(A_ThisHotkey, 3)
if (key ~= "i)^(Ctrl|Shift|Alt|LWin|RWin)$") {
if !ShowSingleModifierKey {
throw
}
key := ""
prefix := RTrim(prefix, "+ ")
if ShowModifierKeyCount {
if !InStr(prefix, "+") && IsDoubleClickEx() {
if (A_ThisHotKey != A_PriorHotKey) || ShowStickyModKeyCount {
if (++repeatCount > 1) {
prefix .= " ( * " repeatCount " )"
}
} else {
repeatCount := 0
}
} else {
repeatCount := 1
}
}
} else {
if ( StrLen(key) = 1 ) {
key := GetKeyChar(key, "A")
} else if ( SubStr(key, 1, 2) = "sc" ) {
key := SpecialSC(key)
} else if (key = "LButton") && IsDoubleClick() {
key := "Double-Click"
}
_key := (key = "Double-Click") ? "LButton" : key
static pre_prefix, pre_key, keyCount := 1
global tickcount_start
if (prefix && pre_prefix) && (A_TickCount-tickcount_start < 300) {
if (prefix != pre_prefix) {
result := pre_prefix pre_key ", " prefix key
} else {
keyCount := (key=pre_key) ? (keyCount+1) : 1
key := (keyCount>2) ? (key " (" keyCount ")") : (pre_key ", " key)
}
} else {
keyCount := 1
}
pre_prefix := prefix
pre_key := _key
repeatCount := 1
}
return result ? result : prefix . key
}
SpecialSC(sc) {
static k := {sc046: "ScrollLock", sc145: "NumLock", sc146: "Pause", sc123: "Genius LuxeMate Scroll"}
return k[sc]
}
; by Lexikos -- https://autohotkey.com/board/topic/110808-getkeyname-for-other-languages/#entry682236
GetKeyChar(Key, WinTitle:=0) {
thread := WinTitle=0 ? 0
: DllCall("GetWindowThreadProcessId", "ptr", WinExist(WinTitle), "ptr", 0)
hkl := DllCall("GetKeyboardLayout", "uint", thread, "ptr")
vk := GetKeyVK(Key), sc := GetKeySC(Key)
VarSetCapacity(state, 256, 0)
VarSetCapacity(char, 4, 0)
n := DllCall("ToUnicodeEx", "uint", vk, "uint", sc
, "ptr", &state, "ptr", &char, "int", 2, "uint", 0, "ptr", hkl)
return StrGet(&char, n, "utf-16")
}
IsDoubleClick(MSec = 300) {
Return (A_ThisHotKey = A_PriorHotKey) && (A_TimeSincePriorHotkey < MSec)
}
IsDoubleClickEx(MSec = 300) {
preHotkey := RegExReplace(A_PriorHotkey, "i) Up$")
Return (A_ThisHotKey = preHotkey) && (A_TimeSincePriorHotkey < MSec)
}
HideGUI() {
Gui, Hide
}
@rfmarves

This comment has been minimized.

Show comment
Hide comment
@rfmarves

rfmarves Nov 2, 2016

Great code. I tried posting in the autohotkey forum, but it's been 4 days with multiple attempts with no success, so here's my comment:

Thanks a ton! I had been looking for something simple like this for a while, but hadn't found it.

I'll be using it to record tutorials in English and Spanish, but for my particular needs, it still needed some tweaking. I have added the option to "Show Only Special Keys", this is to hide all letters and numbers when pressing keys and only show single keypresses that yield in non-alphanumeric codes. I also added the option to "Show Only Modified Mouse Button", which allows all mouse clicks to remain hidden except the "Ctrl+click" or similar modified clicks.

In addition, I needed to translate the keys, as "RWin" or "RClick" don't mean much to someone who doesn't speak English. So I added a KeyLanguage flag that allows for customized translations. Part of this change involved changing the file encoding to UTF-8-BOM. This allows for ↑ characters to be inserted.

As a note, I couldn't get the AltGr key to stop showing as Ctrl+Alt, so I gave up and added it as a "translation" to relabel Ctrl+Alt to AltGr. If someone knows how to fix it, great.

You can check out my edits in the fork I recently made.

rfmarves commented Nov 2, 2016

Great code. I tried posting in the autohotkey forum, but it's been 4 days with multiple attempts with no success, so here's my comment:

Thanks a ton! I had been looking for something simple like this for a while, but hadn't found it.

I'll be using it to record tutorials in English and Spanish, but for my particular needs, it still needed some tweaking. I have added the option to "Show Only Special Keys", this is to hide all letters and numbers when pressing keys and only show single keypresses that yield in non-alphanumeric codes. I also added the option to "Show Only Modified Mouse Button", which allows all mouse clicks to remain hidden except the "Ctrl+click" or similar modified clicks.

In addition, I needed to translate the keys, as "RWin" or "RClick" don't mean much to someone who doesn't speak English. So I added a KeyLanguage flag that allows for customized translations. Part of this change involved changing the file encoding to UTF-8-BOM. This allows for ↑ characters to be inserted.

As a note, I couldn't get the AltGr key to stop showing as Ctrl+Alt, so I gave up and added it as a "translation" to relabel Ctrl+Alt to AltGr. If someone knows how to fix it, great.

You can check out my edits in the fork I recently made.

@Kristinita

This comment has been minimized.

Show comment
Hide comment
@tmplinshi

This comment has been minimized.

Show comment
Hide comment
@tmplinshi

tmplinshi Nov 23, 2016

@Kristinita I added your modifications, thanks.
@rfmarves I didn't notice your comment until now. Thanks for the feedback. I feel lost interest on updating or enhancing this script. :/

Owner

tmplinshi commented Nov 23, 2016

@Kristinita I added your modifications, thanks.
@rfmarves I didn't notice your comment until now. Thanks for the feedback. I feel lost interest on updating or enhancing this script. :/

@klvbdmh

This comment has been minimized.

Show comment
Hide comment
@klvbdmh

klvbdmh Feb 15, 2017

Pressing Win key is registered, but it doesn't bring up the Start menu on Windows 10. Using the latest version of the gist.

klvbdmh commented Feb 15, 2017

Pressing Win key is registered, but it doesn't bring up the Start menu on Windows 10. Using the latest version of the gist.

@tmplinshi

This comment has been minimized.

Show comment
Hide comment
@tmplinshi
Owner

tmplinshi commented Feb 24, 2017

@klvbdmh Fixed.

@erlangp

This comment has been minimized.

Show comment
Hide comment
@erlangp

erlangp Apr 7, 2017

it's work! may i request feature? :D please make the text as mouse tooltip (that follow the mouse). i think it will be good ;D

erlangp commented Apr 7, 2017

it's work! may i request feature? :D please make the text as mouse tooltip (that follow the mouse). i think it will be good ;D

@tmplinshi

This comment has been minimized.

Show comment
Hide comment
@tmplinshi

tmplinshi Sep 19, 2017

@erlangp Sorry for the late reply, I didn't notice your comment.

This can be easily done.

OnKeyPressed:
	try {
		key := GetKeyStr()
		; ShowHotkey(key)
		; SetTimer, HideGUI, % -1 * DisplayTime
		ToolTip(key, DisplayTime)
	}
return

ToolTip(Text, sec) {
	ToolTip, % Text
	SetTimer, ToolTip_Remove, % -1 * sec
	return

	ToolTip_Remove:
		ToolTip
	return
}
Owner

tmplinshi commented Sep 19, 2017

@erlangp Sorry for the late reply, I didn't notice your comment.

This can be easily done.

OnKeyPressed:
	try {
		key := GetKeyStr()
		; ShowHotkey(key)
		; SetTimer, HideGUI, % -1 * DisplayTime
		ToolTip(key, DisplayTime)
	}
return

ToolTip(Text, sec) {
	ToolTip, % Text
	SetTimer, ToolTip_Remove, % -1 * sec
	return

	ToolTip_Remove:
		ToolTip
	return
}
@jasondavis

This comment has been minimized.

Show comment
Hide comment
@jasondavis

jasondavis Jan 12, 2018

I am wanting to show this only when my own script performs a hotkey press to show the action performed. Is there an easy way to make it a function that allows me to pass in the text to be shown in the window?

jasondavis commented Jan 12, 2018

I am wanting to show this only when my own script performs a hotkey press to show the action performed. Is there an easy way to make it a function that allows me to pass in the text to be shown in the window?

@edbridle

This comment has been minimized.

Show comment
Hide comment
@edbridle

edbridle Jan 14, 2018

keypressOSD.ahk - Is innovative Autohotkey Script - I do like it, and it is very good Written by the Programmer, the Structure of the Coding is TipTop. - if you run this Script it will Monitor All you Keyboard and Mouse Movements On the Desktop Screen (to the bottom of the active Window) - this is a Must Have for Any Body that make Video Tutorials.

edbridle commented Jan 14, 2018

keypressOSD.ahk - Is innovative Autohotkey Script - I do like it, and it is very good Written by the Programmer, the Structure of the Coding is TipTop. - if you run this Script it will Monitor All you Keyboard and Mouse Movements On the Desktop Screen (to the bottom of the active Window) - this is a Must Have for Any Body that make Video Tutorials.

@tmplinshi

This comment has been minimized.

Show comment
Hide comment
@tmplinshi

tmplinshi Feb 17, 2018

@jasondavis Just extract CreateGUI() and ShowHotkey() functions to your script. Or use this:

Loop {
	Random, str, 1, 9
	osd.show(str)
	Sleep, 1000
}


class osd
{
	static init := osd._initGUI()

	_initGUI()
	{
		global
		Gui, _osd:+AlwaysOnTop -Caption +Owner +LastFound +E0x20
		Gui, _osd:Margin, 0, 0
		Gui, _osd:Color, Black
		Gui, _osd:Font, cWhite s50 bold, Arial
		Gui, _osd:Add, Text, vHotkeyText Center y20
		WinSet, Transparent, 200
	}

	show(Text, GuiPosition = "bottom")
	{
		WinGetPos, ActWin_X, ActWin_Y, ActWin_W, ActWin_H, A
		if !ActWin_W
			ActWin_W := A_ScreenWidth

		text_w := (ActWin_W > A_ScreenWidth) ? A_ScreenWidth : ActWin_W
		GuiControl, _osd:    , HotkeyText, %Text%
		GuiControl, _osd:Move, HotkeyText, w%text_w% Center

		if (GuiPosition = "Top")
			gui_y := ActWin_Y
		else
			gui_y := (ActWin_Y+ActWin_H) - 115 - 50

		Gui, _osd:Show, NoActivate x%ActWin_X% y%gui_y% h115 w%text_w%
	}
}

@edbridle Thanks.

Owner

tmplinshi commented Feb 17, 2018

@jasondavis Just extract CreateGUI() and ShowHotkey() functions to your script. Or use this:

Loop {
	Random, str, 1, 9
	osd.show(str)
	Sleep, 1000
}


class osd
{
	static init := osd._initGUI()

	_initGUI()
	{
		global
		Gui, _osd:+AlwaysOnTop -Caption +Owner +LastFound +E0x20
		Gui, _osd:Margin, 0, 0
		Gui, _osd:Color, Black
		Gui, _osd:Font, cWhite s50 bold, Arial
		Gui, _osd:Add, Text, vHotkeyText Center y20
		WinSet, Transparent, 200
	}

	show(Text, GuiPosition = "bottom")
	{
		WinGetPos, ActWin_X, ActWin_Y, ActWin_W, ActWin_H, A
		if !ActWin_W
			ActWin_W := A_ScreenWidth

		text_w := (ActWin_W > A_ScreenWidth) ? A_ScreenWidth : ActWin_W
		GuiControl, _osd:    , HotkeyText, %Text%
		GuiControl, _osd:Move, HotkeyText, w%text_w% Center

		if (GuiPosition = "Top")
			gui_y := ActWin_Y
		else
			gui_y := (ActWin_Y+ActWin_H) - 115 - 50

		Gui, _osd:Show, NoActivate x%ActWin_X% y%gui_y% h115 w%text_w%
	}
}

@edbridle Thanks.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment