Тема: AHK: отдельный CapsLock для каждого окна
Началось с того, что я сделал переключение раскладки по CapsLock, а самого CapsLock по Ctrl+Shift. Но сделал это стандартными средствами винды при помощи Microsoft Keyboard Layout Creator. Таким образом осталась проблема переключения раскладки (в данном случае CapsLock) на каждое приложение, а не целиком в системе. Предлагаю скрипт для AutoHotkey_L:
Gui +LastFound
DllCall( "RegisterShellHookWindow", UInt,WinExist() ) ; Ставим системный хук
MsgNum := DllCall( "RegisterWindowMessage", Str,"SHELLHOOK" )
OnMessage( MsgNum, "WaitSwitchWindow" ) ; Подписываемся на сообщения системы
LastActiveWindowID := WinActive("A") ; Сохраняем идентификатор активного окна
caps := {} ; Инициализируем массив
Return ; // End of Auto-Execute Section //
WaitSwitchWindow( wParam, lParam ) {
Global LastActiveWindowID, caps
If ( wParam = 4 And WinExist( "ahk_id " lParam ) ) { ; HSHELL_WINDOWACTIVATED = 4 ; Фильтруем системные сообщения
caps[LastActiveWindowID] := GetKeyState("CapsLock", "T") ; Сохраняем состояние CapsLock для бывшего активного окна
LastActiveWindowID := lParam ; Сохраняем идентификатор нового активного окна
SetCapsLockState, % caps[LastActiveWindowID] ? "On" : "Off" ; Устанавливаем состояние CapsLock для нового активного окна
}
}