-
-
Save tmplinshi/6933557 to your computer and use it in GitHub Desktop.
; 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 | |
} |
My fork: https://gist.github.com/Kristinita/396c2499e5ccac5f78a84620d15ed4cf
Revision: https://gist.github.com/Kristinita/396c2499e5ccac5f78a84620d15ed4cf/revisions#diff-a4e3f62b7b0fef2c333f62a80c29e661
Changes:
- I add all named AutoHotkey keys.
- I add scroll key from my Genius LuxeMate Scroll keyboard.
Thanks.
@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. :/
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 Fixed.
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 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
}
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?
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.
@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.
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.