お世話になります。下記の件お教え下さい。
1.やりたいこと
他のプログラムから出たメッセージボックス(「はい」「いいえ」)の
「はい」を別プログラムから自動的に押したい。
2.知りたいこと
①メッセージボックスのハンドルを取得するために使う EnumChildWindows の使い方を教えて下さい。
特に 2番目と3番目のパラメータが良くわかりません。CALLBACK とかよくワカンナイです。 (T_T)
②「はい」と「いいえ」ボタンの見分け方
「はい」だけ押したいんです。
どうかよろしくお願いします。
はい(&Y)のコントロールIDは 0x00000006、いいえ(&N)のコントロールIDは 0x00000007のようですね。
>①メッセージボックスのハンドルを取得するために使う EnumChildWindows の使い方を教えて下さい。
>特に 2番目と3番目のパラメータが良くわかりません。CALLBACK とかよくワカンナイです。 (T_T)
spy++, FindWindow(), GetWindow()の組み合わせではダメっすか?
OS標準のはい、いいえボタンの場合のコントロールIDは、
はい(&Y)のコントロールIDは 0x00000006、いいえ(&N)のコントロールIDは 0x00000007
かもしれませんが、アプリケーションによっては、はい、いいえボタンを自前で作って
いるものもあるかもしれませんので、コントロールIDで識別するのは危険かもしれませんね。
マウスカーソルが、フォーカスを持ったボタンに自動的に移動するアプリケーションがあるので
そのようにすればできるかもしれませんね。どんなメッセージも「はい」を自動的に押すと
言うのは、アプリケーションの仕様としてもあまりにも無謀だと思うのですが。
通常のメッセージはデフォルトで、はい、いいえどちらかのボタンにフォーカスを設定して
いると思いますので、フォーカスを持っているボタンを選択するほうがよいと思います。
でも、アプリケーションによってはそこまで考慮して作られていないものも多いので
危険ですが。まとまりの無い回答になってしまいますが、私の考えとしては、別のアプリケーション
から出されたメッセージをユーザーの意思に反して勝手に選択するのは止めたほうがよいと
思いますよ。
それとも別の使い方を考えているのですか?
とりあえずですが、OS標準の「はい」押下を作ってみました。
BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
{
HWND hChildWnd;
if(hChildWnd = GetDlgItem(hWnd, lParam))
{
PostMessage(hChildWnd, WM_KEYDOWN, VK_RETURN, 0);
}
return TRUE;
}
CloseMsgBox()
{
EnumWindows(EnumWindowsProc, 0x00000006);
}
>①メッセージボックスのハンドルを取得するために使う EnumChildWindows の使い方を教えて下さい。
>特に 2番目と3番目のパラメータが良くわかりません。CALLBACK とかよくワカンナイです。 (T_T)
分からないと言われても...。
とりあえずgoogleなどでEnumChildWindowsを検索すれば解説やサンプルソースは見つかると思いますけど。
質問者のちちごんです。
NGA さんのシンプルなソースを見て概ね理解でき、
自分のプログラムの中で利用することができました。
ほんとに助かりました。
NGA さん丁寧な書き込みありがとうございました。m(_ _)m
その他にも書き込み下さった masa さん bun さん
ほんとうにありがとうございました。
私の名前はなしですか...。
まあ、たまたま忘れただけだと信じていますが。
ちなみに、0x00000006 = IDYESです。
私もmasaさんの意見と同じで、無条件に「はい」を選択するというのは危険で、せめてフォーカスがあるボタンを選択するなど考えた方がいいのでは。
どのようなアプリケーションを対象にしているのか分からないのでなんとも言えませんけど。