4

ポップアップダイアログを検出して自動的に閉じるアプリケーションに取り組んでいます。私はこれをC++/Win32アプリとして書いています。ダイアログボックスはIE7によって生成され、ウィンドウを検出できますが、[OK]ボタンを「クリック」するためのいくつかの方法が失敗しました。

他の人の解決策を検索し、これらのメッセージをボタンハンドルに送信することは、多くの状況で機能したようです。

PostMessage( handle, WM_LBUTTONDOWN, 0, 0 );
PostMessage( handle, WM_LBUTTONUP, 0, 0 );
PostMessage( handle, BM_SETSTATE, 1, 0 );

ただし、私のテストではボタンの状態には影響しません。

タブ文字をメインウィンドウに送信して、[OK]ボタンにフォーカスが移るのを確認できますが、リターン文字を送信しても何も起こりません。

これについて詳しく知るために、Spy ++を使用して、ウィンドウ階層と、手動で[OK]ボタンをクリックしたときに配信されるメッセージに関する情報を取得しました。

メッセージログを見て、解決策を提供するために縫い合わされたWM_MOUSEACTIVATEについて読んでください。ログ情報は、0002166Cがボタンウィンドウであったことを示しています。だから私のコードで私はこれを試しました:

GetClassNameA( handle, str, str_size );

if( strcmp( str, "Internet Explorer_Server" ) != 0 )
    return TRUE; // Not the window we're interested in.

// Send a message to activate the button window and have it process a mouse click.
PostMessage( handle, WM_MOUSEACTIVATE, (WPARAM) dialog_handle, MAKELPARAM( HTCLIENT, WM_LBUTTONDOWN );

ウィンドウ階層とメッセージログからすると、クラス名が「InternetExplorer_Server」のウィンドウがボタンだと思います。ボタンのクラス名がおかしいように見えるので、間違っているかもしれません...

以下は、ウィンドウ階層画像へのリンクです。手動で[OK]ボタンをクリックしたときのメッセージログです。最後は、ウィンドウを探して1秒のタイマーチケットで実行されるコードです。

どんな洞察と助けも大歓迎です!

ウィンドウ階層、ソース、ウィンドウメッセージ、およびテストダイアログソースの画像は、次の場所から入手できます。

https://sites.google.com/site/matthewmillersmiscellanea/Home/

4

2 に答える 2

3

理想的には、グローバルCBTウィンドウフックをエクスポートするDLLを作成する必要があります。これにより、ダイアログが作成されるときに早期通知を受け取ることができます。これにより、継続的にポーリングすることでリソースを浪費する必要がなくなります。

ダイアログが作成されようとしていることを検出したら、2つのオプションがあります。

1)ダイアログの作成を防ぎます。

これはお勧めしません。CreateDialog()によって有効なHWNDが返されることを完全に期待していたコードであらゆる種類の問題が発生します。

2)ダイアログを非同期的に制御します。

これは、登録ユーザーメッセージでPostMessageを使用し、WNDPROCをフックして取得することで実現しました。このメッセージが表示されたら、現在のダイアログを強制終了する方法を決定する必要があります。

ダイアログを終了する方法は複数あります。

a)WM_COMMAND(BN_CLICKED)を使用して、[OK]、[キャンセル]、[中止]、[いいえ]ボタンの押下をシミュレートします(Chrisのコメント)。GetDlgItem()を使用して、WindowTextを探し、選択することができます。ただし、これは米国英語以外では機能しません。ただし、ここでAccessibilityAPIを活用することには多少の距離があるかもしれません。

b)PostMessage(WM_CLOSE、m_hWnd)を使用してダイアログを閉じることをシミュレートします。これは常に期待どおりに機能するとは限りません。一部のダイアログには[X]閉じるボタンがなく、クライアントコードは代わりに特定のボタンが押されることを期待しています。

c) SendInput()APIを使用してユーザー入力をシミュレートします。これは、ポップアップキラー防止コードが含まれているダイアログを回避しました:)

最終的な解決策は、アプリ/ IEダイアログがID、クラス名、または親クラス名を変更したときに調整できる構成ファイルを含む、ルール+ヒューリスティックベースのアプローチでした。

于 2012-10-01T15:57:58.930 に答える