1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
;; Quickly change keyboard layout ---------------------------------------------
;; -> body
LWin & LShift::
LShift & LWin:: ; (my CapsLock is mapped to LWin)
PostMessage, 0x50, 2, 0,, A ; WM_INPUTLANGCHANGEREQUEST
Sleep, 100
ShowLayout() ; display new layout in tray icon
return
;; Display keyboard layout in tray icon ---------------------------------------
;; -> init
layouts := { ru: DllCall("LoadKeyboardLayout", "Str", "00000419", "Int", 1)
, sv: DllCall("LoadKeyboardLayout", "Str", "0000041D", "Int", 1) }
ShowLayout()
;; -> library
ShowLayout(hwnd := "")
{
global layouts
f := A_FormatInteger
SetFormat, Integer, H
if (hwnd = "")
WinGet, hwnd, id, A
thread := DllCall("GetWindowThreadProcessId", "UInt",hwnd, "UInt",0)
layout := DllCall("user32.dll\GetKeyboardLayout", "UInt",thread, "UInt")
for k, v in layouts
{
if (layout = v)
{
if (FileExist(k ".ico"))
Menu, Tray, Icon, %k%.ico
break
}
}
SetFormat, Integer, %f%
}
;; Update layout display on window change -------------------------------------
;; -> library
LayoutWindowMessage(wParam, lParam)
{
if (wParam = 4 or wParam = 32772) ; HSHELL_WINDOW_ACTIVATED | HSHELL_RUDEAPPACTIVATED
{
ShowLayout(lParam)
WinSet, AlwaysOnTop, On, OSD
}
}
;; -> init
WindowMessageHandlers.Push("LayoutWindowMessage")
;; Click tray icon to open Text Services and Input Languages ------------------
;; -> init
OnMessage(0x404, "NotifyIcon")
;; -> library
NotifyIcon(wParam, lParam)
{
if (lParam = 0x202) ; WM_LBUTTONUP
Run, % "Rundll32 Shell32.dll,Control_RunDLL input.dll,,{C07337D3-DB2C-4D0B-9A93-B722A6C106E2}"
}
|