みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

★WindowsのForm表示をVBで制御したい

お世話になります。

さて「アプリA」という無料ソフトがあって、
それは「OEM」ボタンなるものを提供しており、
自作ソフトMeから通信で制御できるのです。
つまりアプリAの機能を自由に使えるわけです。

そこで、アプリAのボタンをMeから押して、
アプリAのメニュー画面が出して見ると、
自作ソフトMeが最前面のままとなるのです。
これではAかAメニューのどこかをクリックして、
Aを最前面にするか、Meを最小化しないと、
メニュー操作ができません。
ましてやMe画面を最大化しているときは、
AとAメニューは裏に隠れて見えすらしません。
タスクバーをクリック操作すればよいでしょうが、
そうした操作なしに自動化したいのです。
(添付の画像を参照してください)

そこで現状は自作ソフトMeから、

1)アプリAを最小化するメッセージを送る
SendMessage(p.MainWindowHandle,&H112,&HF020,0)
上記関数の引数の意味はよく分かりませんが。

2)アプリAの目的のボタンを通信で押す。
AppliObj.DoButton( TARGET_BUTTOM )

ここからが困っています。

3a)アプリAを元のサイズにするメッセージを送る
SendMessage(p.MainWindowHandle,&H112,&HF120,0)
ところが!、2)をした後では反応しません。
Aメニューがモーダルフォームだからのようです。
順序を逆にしたら、このやっていること自体が無意味。

3b)アプリAの最小化アイコンを手動クリックする
これは成功! Aメニューだけがポップ表示されました。
しかも自作ソフトMeの前面に!
しかし手動クリックをすることは目的から外れます。

3c)アプリAの最小化アイコンを自動クリックする
ところがそのアイコンのX座標が状況で変わるため
自動クリックの位置が定まりません。

なにか解決策を教えてもらえないでしょうか!
よろしくお願い申し上げます m(__)m

投稿日時 - 2015-10-29 15:05:23

QNo.9071758

困ってます

質問者が選んだベストアンサー

> 1)アプリAを最小化するメッセージを送る

これは成功しているんでしょうか?

> 2)アプリAの目的のボタンを通信で押す。

これは成功しているんでしょうか?

> 3a)アプリAを元のサイズにするメッセージを送る

なぜ元のサイズに戻すんでしょうか?
Aメニューが表示されない?


順番としては、

(1)アプリAを最小化
SendMessage
(2)アプリAの目的のボタンを押す
AppliObj.DoButton( TARGET_BUTTOM )
(3)Aメニューを最前面に表示する
SendMessage(最小化されていれば元のサイズに。いらないかも)
SetForegroundWindow(最前面に)

投稿日時 - 2015-10-29 20:47:01

補足

ありがとうございます。

最大の目的は、図に示したことの実現なので、図をよく見て下さいねv(^^)
これが実現するのであれば、方法はどんなものでも構いません。
とりあえず私は、1)2)3a~c)をやってみただけです。
1)2)はその部分では成功しています。
そして3b)も成功しましたが、手動クリックでは目的に合いません。
そこで3c)ですが、目的のアプリAのタスクバーでの座標がわかれば成功することも分かっています。そこで、
★目的アプリAのタスクバーでのアイコン座標が分かる方法があれば、その方法でも目的は達しますので、教えて下さい。

3a)で、なぜ元のサイズに戻すかというと、Aメニューが表示されないだけでなく、アプリAも表示されません。2)でモーダルフォームのAメニューを出してしまったからです。モーダルフォームとは、そのフォーム内、つまりそのWindow内で、例えば「OK」ボタンを押さないとアプリAの処理が進まない状態のことですから、最大化も元に戻すもできない(つまり反応しない)のです。

ちなみにSetForegroundWindow(最前面に)ですが、最前面に出したいのは「アプリAから開いたWindowだけ」です。
★どんな引数を入れたらよいか教えて下されば有り難いです。

繰り返しになりますが、
★1)2)3)の方法でなくても、図に示した目的が達成できればどんな方法でもよいのです。ただ、この関数がいいとだけ教えていただいても、その「引数」とか、それ以前にこんな「宣言」をしておかないといけないとか、ピンポイントで具体的にお願いできれば有り難いです。

よろしくお願い申し上げます。

投稿日時 - 2015-10-30 14:23:24

お礼

その後、3)を以下のようにやってみたら、
Aメニューだけがアクティブに前面表示され大成功!v(^^)/

'AppA のプロセスを探す
Dim ps As System.Diagnostics.Process() = _
System.Diagnostics.Process.GetProcessesByName("AppA")
If 0 < ps.Length Then
'見つかった時は、アクティブにする
Microsoft.VisualBasic.Interaction.AppActivate(ps(0).Id)
End If

ありがとうございました!

投稿日時 - 2015-10-30 16:21:52

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問