他アプリケーションの画面を自動でダブルクリックしたい。

[戻る]
りょう 2003/12/14(日) 01:31:09
SetCursolPosでマウスポインタを他アプリケーションの画面上まで
移動させることには成功したんですが、ダブルクリックさせるために
そのアプリケーションのウィンドウハンドルを取得しPostMessageでWM_LBUTTONDBLCLKを
送信してみたんですがダブルクリックが認識されていないようでした。
ちなみにハンドルは正常に取得できていました。
どうしてでしょうか?

もし分かる方がいらっしゃったら教えていただけないでしょうか?
よろしくお願いします。

sugar 2003/12/14(日) 22:30:33
あくまで可能性の一つとしての話ですが。
ダブルクリックのメッセージをどのウィンドウが処理しているかが関係しているのでは?
必ずしもトップレベルウィンドウで処理されるとは限らないということです。
場合によっては、コントロールで処理されてたり。
関係しそうなウィンドウを色々取得してメッセージを投げてみてはいかがでしょうか。

渋木宏明(ひどり) [E-Mail] [HomePage] 2003/12/15(月) 00:06:36
>必ずしもトップレベルウィンドウで処理されるとは限らないということです。

ですね。

>関係しそうなウィンドウを色々取得してメッセージを投げてみてはいかがでしょうか。

あるいは、SendMessage() ではなく、mouse_event() または SendInput() を使うとか。

たけっち 2003/12/16(火) 06:34:47
りょう様。たけっちといいます。

>SetCursolPosでマウスポインタを他アプリケーションの画面上まで
>移動させることには成功したんですが・・・

ここに興味がわきましたので、よかったら手順を教えてもらえないでしょうか。

>そのアプリケーションのウィンドウハンドルを取得し・・・

ここもお願いしたいです。

なんか横入りですいません。ご迷惑だったら無視してください。

maruo 2003/12/16(火) 20:38:50
以前、別ウィンドウのボタンを押したいときに似たような現象に陥りました。

その際は、
::AttachThreadInput()
を使用して解決しました。

以下のコードは、
「別Window(CWnd* pTgtWnd)の中にあるボタン(CWnd* pPushBtn)を押す」
という処理です。

見当違いかも知れませんがご参考までに。

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
・・・
    //// ウィンドウをトップに移動
    pTgtWnd->SetForegroundWindow();

    //// ボタンの押下処理を行う
    if( pPushBtn->m_hWnd != NULL )
    { 
        DWORD dwPID; 
        DWORD dwTID = ::GetWindowThreadProcessId( pPushBtn->m_hWnd, 
&dwPID ); 

        //// 別スレッドへ入力処理をアタッチする
        ////    ※これを行わないとSetFocus()等が成功しない
        ::AttachThreadInput(::GetCurrentThreadId(), dwTID, TRUE); 

        //// 別スレッドのアプリへフォーカスをあてる
        ::SetFocus( pPushBtn->m_hWnd ); 

        //// フォーカスをあてたボタンの押下処理をシュミレート
        ////    ※スペース押す=>離す
        ::SendMessage( pPushBtn->m_hWnd, WM_KEYDOWN, VK_SPACE, 
0x00000001 );
        ::SendMessage( pPushBtn->m_hWnd, WM_KEYUP  , VK_SPACE, 
0x00000001 );

        //// スレッドを切り離す
        ::AttachThreadInput(::GetCurrentThreadId(), dwTID, FALSE); 
    } 
・・・
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

りょう 2003/12/21(日) 01:07:00
>みなさま
解答ありがとうございます、また返事が遅れてすみませんでした。

>sugarさま
spyでウィンドウの構成を見てみたんですが、コマンドボタンと
メインウィンドウのみで構成されているようなのでどうやら別に
原因があるようです。解答ありがとうございました。

>渋木宏明(ひどり)さま
mouse_event() または SendInput() をつかって試してみます。
解答ありがとうございました。

>たけっちさま
SetCursolPosでのマウスポインタの移動はいたってシンプルで
パラメータにxとyの絶対座標をピクセル単位で指定して呼び出すだけです。
ウィンドウハンドルの取得はFindWindowで該当アプリケーションのタイトル名
を指定して呼び出します。

>maruoさま
マウスでのクリックはフォーカスが関係している可能性も考えていました。
SetActiveWindowやSetFocusを使ってみても効果が認められませんでした。
maruoさまのおっしゃるようにAttachThreadInputを使用してみます。
解答ありがとうございました。

古いスレッドには追加発言できません。