Je n'arrive pas à obtenir SendMessage pour activer un menu sur un autre programme. Lorsque l'on regarde à travers Spy ++ lorsqu'un utilisateur clique sur le menu ce qui suit se produit:SendMessage pour cliquer sur les éléments non-client
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
Alors que lorsque je tente la même chose en utilisant SendMessage avec WM_NCLBUTTONDOWN ce qui suit arrive à la place:
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
Est-ce que quelqu'un sait comment obtenir ceci pour fonctionner correctement?
Vive
Ross
en pensant à cette question, je me demande s'il pourrait y avoir une solution alternative. Pouvez-vous nous dire exactement ce que vous essayez d'atteindre (c'est-à-dire, pourquoi essayez-vous d'activer un menu dans un autre programme)? – jdigital
J'essaie de faire un testeur "Monkey". En tant que partie de ceci, j'ai besoin que le singe soit assez intelligent pour ne pas cliquer sur tout ce qu'il identifie comme une option de menu/bouton de quitter/quitter ce qui est bien sauf qu'il clique si vite qu'il peut cliquer quelque part avant qu'une boîte de dialogue apparaisse et la boîte de dialogue recevra toujours l'entrée et si la boîte de dialogue a un bouton Quitter dessus sous l'endroit où la souris se trouve, elle déclenche le programme ciblé pour quitter. Ce n'est pas l'effet désiré, donc une méthode de détection de l'apparition d'une boîte de dialogue est nécessaire. SendMessage bloque et fournit cette capacité. – Ross