ポップアップダイアログを検出して自動的に閉じるアプリケーションに取り組んでいます。私はこれを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/