Winapi SendMessage以单击非客户端项目

Winapi SendMessage以单击非客户端项目,winapi,sendmessage,user32,Winapi,Sendmessage,User32,我在获取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:170

我在获取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 000A0628 P WM_nclubuttondown nHittest:HTMENU xPos:1706 yPos:395[wParam:00000005 lParam:018B06AA时间:27:23:56.156点:(1706395)] 000A0628 S WM_SYSCOMMAND uCmdType:SC_MOUSEMENU xPos:1706 yPos:395[wParam:0000F095 lParam:018B06AA] 000A0628 S WM_EnterMenuLop fIsTrackPopupMenu:False[wParam:00000000 lParam:00000000] 000A0628 R WM_EnterMenulop lResult:00000000 000A0628 S WM_SETCURSOR hwnd:000A0628 nHittest:HTCAPTION wMouseMsg:0000[wParam:000A0628 lParam:00000002] 000A0628 R WM_设置光标fHaltProcessing:假[lResult:00000000] 000A0628 S WM_INITMENU humanuinit:0020355[wParam:0020355 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)[结果:001A001A] 000C0672 S WM_GETTEXTLENGTH wParam:00000000 LPRAM:00000000 000C0672 R WM_GETTEXTLENGTH cch:26[lResult:000000 1A] 000C0672 S EM_可以撤消wParam:00000000 LPRAM:00000000 000C0672 R EM_可以撤消fCanUndo:True[lResult:00000001] 000A0628 R WM_初始菜单结果:00000000 000A0628 S WM_菜单选择uItem:0 fuFlags:MF_弹出| MF_HILITE | MF_鼠标选择hmenu:0020355[wParam:80900000 lParam:0020355] 000A0628 R WM_菜单选择结果:00000000 000A0628 S WM_INITMENUPOPUP humanupopup:00150595 uPos:0 fsystemmenus:False[wParam:00150595 lParam:00000000] 000A0628 R WM_初始菜单操作结果:00000000 然而,当我尝试将SendMessage与WM_nCluButtonDown一起使用时,会发生以下情况:

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 000A0628 P WM_nclubuttondown nHittest:HTMENU xPos:1700 YPO:400[wParam:00000005 lParam:019006A4时间:27:25:02.156点:(1700400)] 000A0628 S WM_SYSCOMMAND uCmdType:SC_MOUSEMENU xPos:1700 yPos:400[wParam:0000F095 lParam:019006A4] 000A0628 S WM_EnterMenuLop fIsTrackPopupMenu:False[wParam:00000000 lParam:00000000] 000A0628 R WM_EnterMenulop lResult:00000000 000A0628 S WM_EXITMENULOOP fIsTrackPopupMenu:False[wParam:00000000 lParam:00000000] 000A0628 R WM_EXITMENULOOP lResult:00000000 000A0628 S WM_菜单选择uItem:0 fuFlags:FFFF(菜单已关闭)hmenu:00000000[wParam:FFFF0000 lParam:00000000] 000A0628 R WM_菜单选择结果:00000000 000A0628 S WM_EXITMENULOOP fIsTrackPopupMenu:False[wParam:00000000 lParam:00000000] 000A0628 R WM_EXITMENULOOP lResult:00000000 000A0628 R WM_系统命令lResult:00000000 有人知道如何让它正常工作吗

干杯


Ross

您不应该使用SendMessage来模拟鼠标单击和按键。改用。

我猜菜单循环会测试鼠标按钮的状态。但是,您没有模拟按下鼠标按钮,您所做的只是发送一条消息,说明按钮已按下


如果您需要同步行为,我建议您选择一个线程块,并让您的线程块在合适的时间执行。(换句话说,您可以使用异步方法,然后将其包装,使其阻塞并充当同步调用。这是额外的工作,但如果您坚持从本质上是异步的对象执行同步行为,这是最佳解决方案。)

您可以完美地使用SendMessage(),尤其是对于菜单(有关代码示例,请参见MSDN和谷歌群组)

(和钩子无关)

我知道我可以使用SendInput,但是SendInput在消息被处理之前不会阻塞,这是我需要用于编程的SendMessage属性之一。它必须同步的主要原因是任何弹出菜单/模式对话框都有机会出现并被检测到。我不确定我是否可以使用windows钩子完成此操作,因为程序事先不知道单击的位置。是否有方法欺骗菜单循环,使其认为按钮确实已关闭,并且仍然使用SendMessage完成此操作?不确定如何模拟按钮关闭,但如果可以,您如何知道何时模拟按钮关闭p?原始海报已经尝试了SendMessage。它在这里不起作用,因为应用程序正在查看鼠标的状态,但鼠标按钮没有真正按下。SendMessage只完成了一半的工作。考虑到这个问题,我想知道是否有其他解决方案。您能告诉我们您正试图实现的目标吗e(即,你为什么试图激活另一个程序中的菜单)?我试图制作一个“猴子”作为这项工作的一部分,我需要猴子足够聪明,不要点击任何它识别为退出/退出按钮/菜单选项的东西,这很好,只是它点击得太快,以至于它可以在对话框实际弹出之前点击某个地方,对话框仍然会接收输入,如果对话框上有一个退出按钮,在何处鼠标恰好触发目标程序退出。这不是期望的效果,因此需要某种方法来检测对话框何时显示。SendMessage阻止并提供此功能。