SendMessage, чтобы нажать на элементы, не являющиеся клиентами - PullRequest
0 голосов
/ 28 апреля 2009

У меня проблемы с получением SendMessage для активации меню в другой программе. При просмотре Spy ++, когда пользователь нажимает на меню, происходит следующее:

 000A0628 P WM_NCLBUTTONDOWN nHittest:HTMENU xPos:1706 yPos:395 [wParam:00000005 lParam:018B06AA time:27:23:56.156 point:(1706, 395)]
 000A0628 S WM_SYSCOMMAND uCmdType:SC_MOUSEMENU xPos:1706 yPos:395 [wParam:0000F095 lParam:018B06AA]
 000A0628 S WM_ENTERMENULOOP fIsTrackPopupMenu:False [wParam:00000000 lParam:00000000]
 000A0628 R WM_ENTERMENULOOP lResult:00000000
 000A0628 S WM_SETCURSOR hwnd:000A0628 nHittest:HTCAPTION wMouseMsg:0000 [wParam:000A0628 lParam:00000002]
 000A0628 R WM_SETCURSOR fHaltProcessing:False [lResult:00000000]
 000A0628 S WM_INITMENU hmenuInit:00200355 [wParam:00200355 lParam:00000000]
 000C0672 S EM_GETSEL lpdwStart:0010EFA0 lpdwEnd:0010EFA4 [wParam:0010EFA0 lParam:0010EFA4]
 000C0672 R EM_GETSEL wStart:26 wEnd:26 lpdwStart:0010EFA0 (684) lpdwEnd:0010EFA4 (276) [lResult:001A001A]
 000C0672 S WM_GETTEXTLENGTH wParam:00000000 lParam:00000000
 000C0672 R WM_GETTEXTLENGTH cch:26 [lResult:0000001A]
 000C0672 S EM_CANUNDO wParam:00000000 lParam:00000000
 000C0672 R EM_CANUNDO fCanUndo:True [lResult:00000001]
 000A0628 R WM_INITMENU lResult:00000000
 000A0628 S WM_MENUSELECT uItem:0 fuFlags:MF_POPUP | MF_HILITE | MF_MOUSESELECT hmenu:00200355 [wParam:80900000 lParam:00200355]
 000A0628 R WM_MENUSELECT lResult:00000000
 000A0628 S WM_INITMENUPOPUP hmenuPopup:00150595 uPos:0 fSystemMenu:False [wParam:00150595 lParam:00000000]
 000A0628 R WM_INITMENUPOPUP lResult:00000000

Тогда как, когда я пытаюсь сделать то же самое, используя SendMessage с WM_NCLBUTTONDOWN, вместо этого происходит следующее:

 000A0628 P WM_NCLBUTTONDOWN nHittest:HTMENU xPos:1700 yPos:400 [wParam:00000005 lParam:019006A4 time:27:25:02.156 point:(1700, 400)]
 000A0628 S WM_SYSCOMMAND uCmdType:SC_MOUSEMENU xPos:1700 yPos:400 [wParam:0000F095 lParam:019006A4]
 000A0628 S WM_ENTERMENULOOP fIsTrackPopupMenu:False [wParam:00000000 lParam:00000000]
 000A0628 R WM_ENTERMENULOOP lResult:00000000
 000A0628 S WM_EXITMENULOOP fIsTrackPopupMenu:False [wParam:00000000 lParam:00000000]
 000A0628 R WM_EXITMENULOOP lResult:00000000
 000A0628 S WM_MENUSELECT uItem:0 fuFlags:FFFF (menu was closed) hmenu:00000000 [wParam:FFFF0000 lParam:00000000]
 000A0628 R WM_MENUSELECT lResult:00000000
 000A0628 S WM_EXITMENULOOP fIsTrackPopupMenu:False [wParam:00000000 lParam:00000000]
 000A0628 R WM_EXITMENULOOP lResult:00000000
 000A0628 R WM_SYSCOMMAND lResult:00000000

Кто-нибудь знает, как заставить это работать должным образом?

Приветствия

Ross

Ответы [ 3 ]

1 голос
/ 28 апреля 2009

Я думаю, что цикл меню проверяет состояние кнопки мыши. Однако вы не имитировали нажатие кнопки мыши, все, что вы делаете, это отправляете сообщение о том, что кнопка нажата.

Если вам нужно синхронное поведение, я бы предложил Windows Хук и ваш блок потоков до нужного времени. (Другими словами, вы можете использовать асинхронный подход, а затем обернуть его так, чтобы он блокировал и действовал как синхронный вызов. Это дополнительная работа, но если вы настаиваете на синхронном поведении чего-то, что по своей природе асинхронно, это ваше лучшее решение.)

1 голос
/ 28 апреля 2009

Вы не должны использовать SendMessage для симуляции щелчков мышью и нажатий клавиш. Вместо этого используйте SendInput .

0 голосов
/ 28 апреля 2009

Вы можете прекрасно использовать SendMessage (), в частности, для меню (см. MSDN и Google Groups для примеров кода)
(а крючкам тут нечего делать)

...