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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
;; Quickly change keyboard layout ---------------------------------------------
;; -> body
^\::
^+\::
if (GetKeyState("Shift"))
new := altlayout
else
{
new := activelayouts[1]
current := Layout()
for k, v in activelayouts
{
if (v = current)
new := activelayouts[k+1]
}
if (new = "")
new := activelayouts[1]
}
DllCall("SendMessage", "UInt", WinActive("A"), "UInt", 80, "UInt", 1, "UInt", new)
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)
, us: DllCall("LoadKeyboardLayout", "Str", "00000409", "Int", 1)
, jp: DllCall("LoadKeyboardLayout", "Str", "00000411", "Int", 1) }
activelayouts := [layouts.us, layouts.jp]
altlayout := layouts.ru
ShowLayout()
;; -> library
Layout() {
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")
SetFormat, Integer, %f%
return layout
}
ShowLayout(hwnd := "")
{
global layouts
layout := Layout()
for k, v in layouts
{
if (layout = v)
{
if (FileExist(k ".ico"))
Menu, Tray, Icon, %k%.ico
break
}
}
}
;; 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}"
}
|