- ベストアンサー
SendKeys関数でのタイミング問題とは?
- SendKeys関数を使用してアンインストール中のウィンドウに対して"{ENTER}"キーを送信してもメッセージが消えない問題が発生しています。
- アンインストールが終了し、OKボタンが有効になったタイミングで"{ENTER}"キーを送る方法を探しています。
- GetCodeExitProcssはメッセージが残っている場合には使用できず、良い解決方法を知りたいという質問です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ちょっと勘違いしていました。 そうすると、OKボタンのウィンドウハンドルを取得した後で、OKボタンの状態(有効か無効か)を調べ、有効なら SendMessage か SendKeys か、ということになりますね。 有効か無効かは、IsWindowEnabled で判定できると思います。
その他の回答 (1)
- tsukasa-12r
- ベストアンサー率65% (358/549)
(1) FindWindow でウィンドウハンドルを取得 (2) GetWindow、GetTopWindow、GetNextWindow のあたり、あるいは EnumChildWindow を使用して、(1) のウィンドウの子ウィンドウの中からOKボタンを探す。 (確か VB5.0 からだったか、VB のユーザー関数のアドレスを API に渡すことができるようになったので、VB でも EnumChildWindow が使用できるような気がします。実際にやったことはないので、よくわからないですけど。) (3) OKボタンが見つかれば SendKeys か SendMessage か何かの処理をする。 ( SendMessage の方が誤動作の可能性がなくて確実だと思います。) のような感じになるのではないでしょうか。
補足
回答ありがとうございます。 でも、ちょっとひとつだけひっかがる点が・・・。 (3)の"OKボタンが見つかれば SendKeys かSendMessage か何かの処理をする。"です。 私が制御したい画面は、アンインストール中にすでに OKボタンが存在しています。 ボタンが無効になっている状態なのです。 だから、ボタンが有効になったときに"{ENTER}"キーを 飛ばしたいと思いまして・・・。 なので、tsukasa-12rさんのおっしゃる方法は有効なのでしょうか?? まだ試していないので、とりあえずはやってみようと思います。 引き続き、おつきあいください。 よろしくお願いします。
お礼
ありがとうございました!! ようやくできました(T_T) 私がやった流れとしては、 (1)大本のWindowのプロセスを取得する。 (2)プロセスからOpenprocessでハンドルを取得。 (3)ループの中で、GetWindowで子ウィンドウのハンドルを取る。 (終了条件は、FindWindowで画面があるかどうか) (4)取ったハンドルのクラス名を取る。 (5)クラス名がボタンだった場合に、IsWindowEnabledで 有効かを見る。 (6)ボタンが有効だった場合にキーと飛ばす。 です。 API使いまくりで完成しました。 知らないAPIばかりで勉強になりました。 本当にありがとうございました☆