1 (изменено: stealzy, 2017-02-14 01:56:00)

Тема: 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 посылать сообщения бесполезно, реагируют только дочерние.
TaskBar

Но при попытке сделать это из 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: как выяснилось, панель не принимает собщения, когда фокус на ней.
Ну или хотя бы способ переключения на ней посоветуйте :-).

2

Re: AHK: Послать сообщение панели задач

У меня так с панелью задач работает :

f1::
ControlGetFocus, control, A
PostMessage, 0x50, 2, 0, %control%, A

3 (изменено: svoboden, 2017-08-07 10:55:10)

Re: AHK: Послать сообщение панели задач

Так, может:

 WinWait, ahk_class Shell_TrayWnd
    ControlGetPos,,, W, H, ToolbarWindow321
    Loop % W,
    PostMessage, WM_MOUSEMOVE := 0x200,, (A_Index - 1)|((H/2)<<16), ToolbarWindow321

4

Re: AHK: Послать сообщение панели задач

Malcev, svoboden
Ваши способы у меня не работают. Win7sp1 x64, ahk Ux64.
А мой код у вас переключает?

5

Re: AHK: Послать сообщение панели задач

В панеле задач видно надо контролу отправлять сообщение, а не окну.
А так работает?

f1::
PostMessage, 0x50, 2, 0, SysListView321, Windows Task Manager

6 (изменено: stealzy, 2017-02-13 23:36:05)

Re: AHK: Послать сообщение панели задач

Никак нет. Протестировал еще под аналогичной свежеустановленной системой, для надежности.
Вы на чем сидите интересно, подписей нет у вас.
Malcev, подозреваю что вы мое стартовое сообщение не читали.
Я именно, что дочерним окнам (контролам) посылал.
И причем успешно, надо заметить. Но не из ahk.

7 (изменено: svoboden, 2017-03-11 04:11:13)

Re: AHK: Послать сообщение панели задач

Думаю, что в x64 все и дело, у меня x32 стоит.

8 (изменено: stealzy, 2017-02-13 23:54:28)

Re: AHK: Послать сообщение панели задач

Версия вашей ОС 7? Каким же образом по-вашему тут так играет разрядность, что другими инструментами посылаемое сообщение обрабатывается правильно, а из ahk иначе, и причем только с панелью задач? Работает ли у вас мой способ?

9

Re: AHK: Послать сообщение панели задач

А зачем вообще в панели задач раскладку менять?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10 (изменено: stealzy, 2017-02-14 01:56:38)

Re: AHK: Послать сообщение панели задач

Ну просто из принципа xD.
Вы меня натолкнули на мысль, кстати. Можно менять раскладку кнопке пуск попробовать.
Не вышло.

11

Re: AHK: Послать сообщение панели задач

stealzy, у меня ваш код не работает. У меня система такая же как у вас.
А такой код в панели задач у вас работает?
Должен сдвинуть вертикальный ползунок вниз.

f1::
ControlGetFocus, control, A
SendMessage, 0x115, 1, 0, %control%, A

12 (изменено: teadrinker, 2017-02-14 00:06:47)

Re: AHK: Послать сообщение панели задач

Вот так у меня работает:

WM_INPUTLANGCHANGEREQUEST := 0x50, INPUTLANGCHANGE_FORWARD := 0x2
hTray := DllCall("FindWindowEx", Ptr, WinExist("ahk_class Shell_TrayWnd"), Ptr, 0, Str, "TrayNotifyWnd", UInt, 0, Ptr)

F11::
   DetectHiddenWindows, On
   WinActivate, ahk_id %A_ScriptHwnd%
   PostMessage, WM_INPUTLANGCHANGEREQUEST, INPUTLANGCHANGE_FORWARD,,, ahk_id %hTray%
   WinActivate, ahk_class Shell_TrayWnd
   Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK: Послать сообщение панели задач

Malcev, нет.
teadrinker, работает!

14 (изменено: stealzy, 2017-02-14 00:20:48)

Re: AHK: Послать сообщение панели задач

Работает даже без параметра INPUTLANGCHANGE_FORWARD.
Но расскажите, как вы дошли о необходимости WinActivate? Я вообще связи не вижу.
Вы случайно заметили, что переключение работает, если панель не в фокусе?
Или вы знали?)

15

Re: AHK: Послать сообщение панели задач

Такой костыль правда применять не выйдет - панель теряет фокус. Если, допустим открыто меню Пуск, оно скроется. В контексте набора текста это вдвойне нехорошо.

16

Re: AHK: Послать сообщение панели задач

stealzy пишет:

Вы случайно заметили, что переключение работает, если панель не в фокусе?

Да, это заметил.

stealzy пишет:

Если, допустим открыто меню Пуск, оно скроется.

А причём тут меню Пуск? У него своё окно, в него нужно и посылать обычным способом.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17 (изменено: stealzy, 2017-02-14 00:35:28)

Re: AHK: Послать сообщение панели задач

Окно то у него свое, а раскладку они общую имеют. Я пробовал посылать Пуску с тем же результатом, что и панели задач.
Думаю, может попробовать посылать сообщения через DllCall, если это баг ahk.

18

Re: AHK: Послать сообщение панели задач

stealzy, я просто перепутал панель задач с диспетчером задач (привык уже к английским названиям).

f1::
ControlFocus, CiceroUIWndFrame1, ahk_class Shell_TrayWnd
PostMessage, 0x50, 2, 0, CiceroUIWndFrame1, ahk_class Shell_TrayWnd

19

Re: AHK: Послать сообщение панели задач

С Пуском у меня работает так.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

20 (изменено: stealzy, 2017-02-14 00:56:17)

Re: AHK: Послать сообщение панели задач

Да, с пуском работает и мой код, если меню пуск открыто.
Я пробовал окну Пуска посылать в неоткрытом состоянии.
Если бы удалось, тогда и панель задач по логике изменила бы раскладку.
Malcev, поэтому и назвал тему "SendMessage to TaskBar", но тов. модератор изменил название темы на свой вкус.

21 (изменено: stealzy, 2017-02-14 01:57:22)

Re: AHK: Послать сообщение панели задач

И опять: сообщение свернутому меню пуск из Inq'a работает, из ahk - нет.
UPD: А, понятно, все из-за фокуса на панели.

22

Re: AHK: Послать сообщение панели задач

WM_INPUTLANGCHANGEREQUEST := 0x50, INPUTLANGCHANGE_FORWARD := 0x2

F11::
   DetectHiddenWindows, On
   ControlFocus, DirectUIHWND1, ahk_class DV2ControlHost
   PostMessage, WM_INPUTLANGCHANGEREQUEST, INPUTLANGCHANGE_FORWARD,, DirectUIHWND1, ahk_class DV2ControlHost
   Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

23 (изменено: stealzy, 2017-02-14 01:13:22)

Re: AHK: Послать сообщение панели задач

Да, именно так я и пытался с DV2ControlHost.
Только захардкодил id, в вашем примере переменная DirectUIHWND1 пустая остается (поиск windows отключен - фокуса нет):


DetectHiddenWindows On
PostMessage, 0x50, 2, 0, SysListView321, ahk_id 0x400e8

24

Re: AHK: Послать сообщение панели задач

У меня работает, даже когда панель задач активна.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

25 (изменено: stealzy, 2017-02-14 01:18:48)

Re: AHK: Послать сообщение панели задач

У меня работает только когда ПЗ неактивна или открыто меню Пуск (что по сути одно и тоже).

26

Re: AHK: Послать сообщение панели задач

stealzy пишет:

Win7sp1 x64, ahk Ux64.

У меня то же самое.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

27

Re: AHK: Послать сообщение панели задач

stealzy пишет:

У меня работает только когда ПЗ неактивна или открыто меню Пуск (что по сути одно и тоже).

Так у вас же код неполный.

DetectHiddenWindows On
PostMessage, 0x50, 2, 0, SysListView321, ahk_id 0x400e8

А нужно:

DetectHiddenWindows On
ControlFocus, Desktop OpenBox Host1, ahk_class DV2ControlHost
PostMessage, 0x50, 2, 0, Desktop OpenBox Host1, ahk_class DV2ControlHost

28

Re: AHK: Послать сообщение панели задач

Универсальный способ для всех окон, но с побочным эффектом - окна теряют фокус, а панель задач показывает тултип с текущим временем.

f2::
ControlGetFocus, fc, % hwnd:=WinExist("A")
ControlGet id, Hwnd,, % fc, ahk_id %hwnd%
ControlFocus,, ahk_id %id%
PostMessage, 0x50, 0x2, 0, , ahk_id %id%
Return

29

Re: AHK: Послать сообщение панели задач

Безотносительно основной темы, почему код по F2 приводит к потере фокуса, а код по F3 нет?

F2::
ControlGetFocus, fc, % hwnd:=WinExist("A")
ControlGet id, Hwnd,, % fc, ahk_id %hwnd%
ControlFocus,, ahk_id %id%
Return
F3::
ControlGetFocus, fc, % hwnd:=WinExist("A")
ControlGet id, Hwnd,, % fc, ahk_id %hwnd%
ControlFocus, fc, ahk_id %hwnd%
Return

Самое забавное, если после потери фокуса вызвать ControlGetFocus, то он скажет, что в фокусе остался тот же контрол.

30 (изменено: svoboden, 2017-02-14 03:20:48)

Re: AHK: Послать сообщение панели задач

fc забыли поставить в ControlFocus,, ahk_id %id%

31

Re: AHK: Послать сообщение панели задач

Запись неверна:

ControlGetFocus, fc, % hwnd:=WinExist("A")

Надо так:

ControlGetFocus, fc, % "ahk_id " hwnd:=WinExist("A")

32

Re: AHK: Послать сообщение панели задач

До меня наконец дошло, почему такое поведение.

А о каком поведении речь?

33

Re: AHK: Послать сообщение панели задач

Игнорирование сообщений ПЗ, когда фокус на ней.