[リストへもどる]
一括表示

投稿時間:2004/01/26(Mon) 16:14
投稿者名:F90
Eメール:
URL :
タイトル:
別プログラムのメッセージボックス等を制御する方法
はじめまして、いつも掲示板など見させて頂いております。
下らない質問かもしれませんが、いいアイデアが出て来なくて困っています。
どうぞ宜しくお願い致します。m(_ _)m

他に起動しているプログラムが出す、メッセージボックス等を自動で認識して
メッセージボックス内の『OK』『キャンセル』ボタン等を自動でマウスクリック
させるプログラムが作りたいと思っています。
常に同じ位置にメッセージボックスが出て来れば問題無いのですが、微妙に位置が
変わったり、画面解像度によっても変わって来るので困っています。
マウスで移動・クリックに関しては、こちらの逆引きヘルプにも掲載されているので
問題ないのですが、メッセージボックスのボタンの座標をどうすれば取得出来るか、
皆さんの技術やアイデア・ヒントを頂ければと思います。
宜しくお願い致します。

投稿時間:2004/01/26(Mon) 16:37
投稿者名:いちゆ
Eメール:
URL :
タイトル:
Re: 別プログラムのメッセージボックス等を制御する方法
とりあえず、目標となる親ウィンドウのハンドルをParentHWNDとして、
EnumChildWindows()とかいう名前(たぶん)のAPIを使って子ウィンドウを列挙。
子ウィンドウがさらに子ウィンドウを持っている可能性があるから…まぁ、それは再帰としてとればいいし。
あとは目的の子ウィンドウかどうかを判別する(GetClassLong APIかなにかでクラスを取得できたはず)。
その座標は…そんな関数探せばあるでしょう。
でもメッセージボックスってダイアログウィンドウだったから、大丈夫なのか?

とか、適当に考えてみる。
多分無理が多いと思うけど

投稿時間:2004/01/26(Mon) 22:58
投稿者名:F90
Eメール:
URL :
タイトル:
Re^2: 別プログラムのメッセージボックス等を制御する方法
いちゆ様、レスありがとうございます。
やはりかなり難しそうですね〜・・・(>_<)

API関係をかなり探れば、何かしらの方法は見付かるのかもしれませんね。
と言っても、初心者の域をなかなか出られないレベルなので、半分諦めています。(ToT)
APIが無理なら、一定時間ごとに画面をキャプチャーして変化を判定するとか
出来ないものでしょうか?
かなり素人考えなんですけど(笑)

投稿時間:2004/01/26(Mon) 23:10
投稿者名:Say
Eメール:
URL :
タイトル:
Re^3: 別プログラムのメッセージボックス等を制御する方法
> APIが無理なら、一定時間ごとに画面をキャプチャーして変化を判定するとか
> 出来ないものでしょうか?
おそらく、非常に重い処理になります。
やめといたほうが無難かと。

投稿時間:2004/01/26(Mon) 23:07
投稿者名:Say
Eメール:
URL :
タイトル:
Re: 別プログラムのメッセージボックス等を制御する方法
どういうクラス構成になっているか、ダイアログが出た状態で
一度Spy++などを起動して確認されることをお奨めしますが、
例えば、VBのMsgBoxで出るダイアログなら、
ダイアログ自体が独立してトップレベルウィンドウに現われますから、
その中の例えば「OK」ボタンを押したいのなら、
クラス名 = vbNullString,キャプション名 = "そのダイアログのタイトル"で
FindWindowし、得られたハンドルを使って
クラス名 = "Button" , キャプション名 = "OK"でFindWindowExすれば、
OKボタンのハンドルが取得できます。
そのハンドルに対し、行いたい操作をSendMessageなりすれば、いいでしょう。
ただし、「自動的に」となると、常駐してハンドルを常時監視する必要があるかと。