Тема: AHK: Послать сообщение панели задач
Использую скрипт для переключения раскладки. Благодаря подсказкам из темы работает почти везде.
changeLang(hwnd := "", lcode := "") { ; lcode = 0x04090409
hwnd := hwnd ? hwnd : WinExist("A")
PostMessage 0x50, % lcode ? "" : 2, lcode ? lcode : "",, % (OwnHwnd := DllCall("GetWindow", Ptr, Hwnd, UInt, GW_OWNER := 4, Ptr)) ? "ahk_id" OwnHwnd : "ahk_id" Hwnd
}
Заметил, что переключалка не работает на панели задач.
Неясно почему, но главному окну ahk_class Shell_TrayWnd посылать сообщения бесполезно, реагируют только дочерние.
Но при попытке сделать это из ahk переключения ни происходит, хотя из InqSoft то же сообщение в то же окно работает.
Все дело в фокусе на панели.
PoC(если у вас этот код работает, дайте мне знать):
; hwnd := WinExist("A")
hwnd := WinExist("ahk_class Shell_TrayWnd") ; TaskBar
ControlGet, hwnd, hwnd,, TrayNotifyWnd1, ahk_id %hwnd%
; WinGetClass cl, ahk_id %hwnd%
; ToolTip % cl " . " hwnd
Return
F1::SendMessage WM_INPUTLANGCHANGEREQUEST := 0x50, 2,,, ahk_id %hwnd% ; toggle
F2::SendMessage WM_INPUTLANGCHANGEREQUEST := 0x50,, 0x04090409,, ahk_id %hwnd% ; EN
F3::SendMessage WM_INPUTLANGCHANGEREQUEST := 0x50,, 1049,, ahk_id %hwnd% ; RU
Esc::ExitApp
Я залогировал получаемые TrayNotifyWnd сообщения типа WM_INPUTLANGCHANGEREQUEST и WM_INPUTLANGCHANGE.
Ahk - Переключение в обычном окне PostMessage:
P WM_INPUTLANGCHANGEREQUEST fSysCharset:True hkl:00000000
S WM_INPUTLANGCHANGE charset:000000CC hkl:04190419
R WM_INPUTLANGCHANGE
Ahk - Переключение в обычном окне SendMessage:
S WM_INPUTLANGCHANGEREQUEST fSysCharset:True hkl:00000000
S WM_INPUTLANGCHANGE charset:000000CC hkl:04190419
R WM_INPUTLANGCHANGE
R WM_INPUTLANGCHANGEREQUEST
Ahk - Переключение в панели задач (TrayNotifyWnd) PostMessage:
P WM_INPUTLANGCHANGEREQUEST fSysCharset:True hkl:00000000
Ahk - Переключение в панели задач (TrayNotifyWnd) SendMessage:
S WM_INPUTLANGCHANGEREQUEST fSysCharset:True hkl:00000000
R WM_INPUTLANGCHANGEREQUEST
InqSoft - Переключение в панели задач (TrayNotifyWnd):
S WM_INPUTLANGCHANGEREQUEST fSysCharset:True hkl:00000000
S WM_INPUTLANGCHANGE charset:000000CC hkl:04190419
R WM_INPUTLANGCHANGE
R WM_INPUTLANGCHANGEREQUEST
Видно, после сообщения скрипта, система обычно посылает окну еще одно сообщение, которое и переключает.
UPD: как выяснилось, панель не принимает собщения, когда фокус на ней.
Ну или хотя бы способ переключения на ней посоветуйте :-).