Skip to content

Instantly share code, notes, and snippets.

@i5ar
Forked from tmplinshi/KeypressOSD.ahk
Last active October 27, 2016 02:14
Show Gist options
  • Save i5ar/f8db473f22942d81b8fb3fe5d15f8201 to your computer and use it in GitHub Desktop.
Save i5ar/f8db473f22942d81b8fb3fe5d15f8201 to your computer and use it in GitHub Desktop.
Keypress On Screen Display
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
; KeypressOSD.ahk
;----------------------------------------------------------
; ChangeLog : v2.05 (2016-10-01) - Fixed not detecting "Ctrl + ScrollLock/NumLock/Pause"
; 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 ; True or False
global ShowMouseButton := True ; True or False
global DisplayTime := 2000 ; In milliseconds
global GuiPosition := "Bottom" ; Top or Bottom
global FontSize := 24
global GuiHeight := 80
CreateGUI()
CreateHotkey()
return
OnKeyPressed:
try {
key := GetKeyStr()
ShowHotkey(key)
SetTimer, HideGUI, % -1 * DisplayTime
}
return
; ===================================================================================
CreateGUI() {
global
Gui, +AlwaysOnTop -Caption +Owner +LastFound +E0x20
Gui, Margin, 0, 0
Gui, Color, FFFFFF
Gui, Font, c000000 s%FontSize% bold, Arial
Gui, Add, Text, vHotkeyText Center y20
WinSet, Transparent, %TransN%
}
CreateHotkey() {
Loop, 64
Hotkey, % "~*" Chr(A_Index + 31), OnKeyPressed
Loop, 24 ; F1-F24
Hotkey, % "~*F" A_Index, OnKeyPressed
Loop, 10 ; Numpad0 - Numpad9
Hotkey, % "~*Numpad" A_Index - 1, OnKeyPressed
Otherkeys := "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"
Loop, parse, Otherkeys, |
Hotkey, % "~*" A_LoopField, OnKeyPressed
If ShowMouseButton {
Loop, Parse, % "LButton|MButton|RButton", |
Hotkey, % "~*" A_LoopField, OnKeyPressed
}
}
ShowHotkey(HotkeyStr) {
WinGetPos, ActWin_X, ActWin_Y, ActWin_W, ActWin_H, A
if !ActWin_W
throw
text_w := 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"]
for i, mod in modifiers {
if GetKeyState(mod)
prefix .= mod " + "
}
if (!prefix && !ShowSingleKey)
throw
key := SubStr(A_ThisHotkey, 3)
if (key = " ") {
key := "Space"
} 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"
}
return prefix . key
}
SpecialSC(sc) {
static k := {sc046: "ScrollLock", sc145: "NumLock", sc146: "Pause"}
return k[sc]
}
; 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")
}
; http://msdn.microsoft.com/en-us/library/dd318693%28v=vs.85%29.aspx
; it := DllCall("LoadKeyboardLayout", "Str", "00000410", "Int", 1)
IsDoubleClick(MSec = 300) {
Return (A_ThisHotKey = A_PriorHotKey) && (A_TimeSincePriorHotkey < MSec)
}
HideGUI() {
Gui, Hide
}
; Startup.ahk
;------------------------------------------------------------------------------
; Startup directory: "C:\Users\<username>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup"
;------------------------------------------------------------------------------
; Open Keypress On Screen Display "Ctrl-Shift-k"
^+k::Run "D:\Program Files\AutoHotkey\iSar\KeypressOSD\KeypressOSD.exe"
@i5ar
Copy link
Author

i5ar commented Oct 18, 2016

Executable:

Ahk2Exe.exe /in KeypressOSD.ahk /icon Keyboard.ico

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