2009-04-27 21 views
0

SendMessageで別のプログラムのメニューを有効にするのに問題があります。メニューをユーザーがクリックすると、以下が発生したときにスパイ++を見たとき:SendMessageが非クライアント項目をクリックする

 
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

を私はWM_NCLBUTTONDOWNでのSendMessageを使用して同じことをしようとすると、次の代わりに起こるのに対し:

 
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 

が取得する方法を誰もが知っていますこれは正しく動作するのですか?

乾杯

ロス

+0

を使用することができます別の解決方法があるかもしれません。達成しようとしていること(つまり、別のプログラムのメニューをアクティブ化しようとしている理由)を教えてください。 – jdigital

+0

私は "Monkey"テスターを作ろうとしています。これの一部として、私は猿が十分にスマートになって、終了/終了ボタン/メニューオプションとして認識されるものをクリックしないようにする必要があります。ただし、ダイアログが実際にポップアップする前にどこかをクリックすることができますダイアログは引き続き入力を受け取り、ダイアログに終了ボタンが表示されている場合は、ターゲットプログラムを終了させるためのマウスの位置が表示されます。これは望ましい効果ではないので、ダイアログがいつ現れるかを検出するいくつかの方法が必要です。 SendMessageをブロックし、この機能を提供します。 – Ross

答えて

1

メニューループがマウスボタンの状態をテストすると思います。しかし、あなたはマウスボタンを押すことをシミュレートしていません。あなたがしているのは、ボタンが押されたというメッセージを送信することだけです。

同期動作が必要な場合は、windows hookを提案し、適時にスレッドをブロックしてください。 (言い換えれば、非同期のアプローチを使用して、それをブロックして同期呼び出しとして動作させることができます。これは余分な作業ですが、本質的に非同期のものから同期動作を主張する場合は、

+0

同期が必要な主な理由は、ポップアップメニュー/モーダルダイアログが表示され検出される可能性があるためです。私はプログラムがクリックしている場所の事前知識を持っていないので、私はWindowsフックでこれを達成することができるかどうかは分かりません。ボタンが本当にダウンしていると思ってSendMessageを使ってメニューループをトリックする方法がありますか? – Ross

+0

ボタンをシミュレートする方法がわかりませんが、可能であれば、ボタンをシミュレートするタイミングをどのように知っていますか? – jdigital

1

あなたは、マウスのクリックやキーの押下をシミュレートするためのSendMessageを使用しないでください。代わりにSendInputを使用してください。

+0

私はSendInputを使うことができますが、SendInputはメッセージが処理されるまでブロックされません。これはSendMessageのプロパティの1つで、私がプログラミングしているものに利用する必要があります。 – Ross

0

あなたは完全に私は思ったんだけど、この問題を考えるには、メニューのため、特にのSendMessage()、(コードのサンプルについては、MSDNやGoogleグループを参照してください)
(とフックがここには何の関係もない)

+0

元のポスターは既にSendMessageを試しました。アプリケーションがマウスの状態を見ているが、マウスボタンが実際にはダウンしていないため、ここでは機能しません。 SendMessageは半分しか仕事をしていません。 – jdigital

関連する問題