Question

Je ne parviens 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:

 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

Quelqu'un sait comment obtenir que cela fonctionne correctement?

Vive

Ross

Était-ce utile?

La solution

Je suppose que les tests de boucle de menu pour l'état du bouton de la souris. , Vous avez cependant pas simulé en appuyant sur le bouton de la souris, tout ce que vous faites est d'envoyer un message indiquant que le bouton est enfoncé.

Si vous avez besoin comportement synchrone, je suggère un fenêtres crochet et votre bloc de fil jusqu'à ce que le bon moment. (En d'autres termes, vous pouvez utiliser une approche asynchrone, puis l'envelopper de sorte qu'il bloque et agit comme un appel synchrone. Il est un travail supplémentaire, mais si vous insistez sur le comportement synchrone de quelque chose qui est intrinsèquement asynchrone, il est la meilleure solution.)

Autres conseils

Vous ne devriez pas utiliser SendMessage pour simuler les clics de souris et touches. Utilisez SendInput à la place.

Vous pouvez utiliser parfaitement SendMessage (), en particulier pour les menus (voir Groupes MSDN et Google pour des exemples de code)
(Et les crochets ont rien à voir ici)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top