2013-04-30 12 views
7

ダイアログボックスにあるボタンのクリックをシミュレートします。ボタンのウィンドウのハンドルを指定すると、どのようにボタンのクリックをシミュレートできますか?

私はそのウィンドウのハンドルを持っています。これはAbort/Retry/Ignoreの種類のウィンドウです。

私のニーズに合わないため、X座標とY座標を持つクリックをシミュレートすることはしたくありません。

+0

これは助けになるだろうか? http://forums.codeguru.com/showthread.php?377394-Windows-SDK-User-Interface-How-can-I-emulate-mouse-events-in-an-application – Friedrich

+0

これは正常ではありません。 assertがどこかで失敗し、デバッグバージョンを実行しているようです。 _set_abort_behavior()を試してください。 –

答えて

8

は、あなたが(FindWindowExを使用して)をクリックするボタンへのハンドルを見つけ、クリックするだけメッセージを送る:

SendMessage(hButton, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(0, 0)); 
SendMessage(hButton, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(0, 0)); 
+0

これは機能しますが、それは敬語ではありません。 WinAPIはウィンドウのボタンの1つを直接「クリック」する機能をサポートしていませんか?そして私はSpy ++を使用してボタンの名前を取得しなければなりませんでしたが、これは簡単ではありませんでした。 –

+0

@AronBogutaターゲットボタンハンドルを見つけるまで、 'EnumChildWindows'を使ってすべてのウィンドウを列挙できます。 WinAPIに、ウィンドウのボタンを直接「クリック」する機能が含まれていた場合、それはまさに同じことでした。また、WinAPIはボタンを(子)ウィンドウとして扱います。 –

+0

ありがとう、私はすでにEnumChildWindowsについて知っていますが、私はWinAPIからさらに多くのメッセージを期待しています:) –

2

OKのためにこれを試してみてください:

SendMessage(hWnd, WM_COMMAND, 1, NULL); 
+0

OKボタンはありません。私は言ったように中止/再試行/無視をクリックしたいと思います。中止 –

4

SendMessage(hParent, WM_COMMAND, MAKEWPARAM(IdOfButton, BN_CLICKED), (LPARAM)hwndOfButton);

よくわからないのであれば、通常はhwndOfButtonがなくても出ることができます - ダイアログの実装に依存します!

使用ケースに応じて、SendMessageまたはPostMessageにすることができます。

+0

他のすべての答えを試してみました。これは私のために働いた唯一のものです。 –

9

は、ボタンのHWNDにBM_CLICKメッセージを送る:

SendMessage(hButton, BM_CLICK, 0, 0); 
WM_LBUTTONDOWNWM_LBUTTONUPメッセージを受信するためのボタンを引き起こし

、および親をユーザーが物理的にクリックされたかのように、BN_CLICKED通知を受信しますボタン。ここで

1

が完了関数です

void clickControl(HWND hWnd, int x, int y) 
{ 
    POINT p; 
    p.x = x; p.y = y; 
    ClientToScreen(hWnd, &p); 
    SetCursorPos(p.x, p.y); 
    PostMessage(hWnd, WM_MOUSEMOVE, 0, MAKELPARAM(x, y)); 
    PostMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(x, y)); 
    PostMessage(hWnd, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(x, y)); 
} 
+0

これは元の質問に答えることはできませんが、それは私が探していたもの、感謝のために私を助けました! –

関連する問題