- - PR -
VBからC++のフォームを起動してフォーム上のボタンを押下したい
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2009-03-10 22:14
お世話さまです。
VB.NET2005のウインドウフォームからC++のウインドウフォームを起動し、 そのフォーム上にある2つのボタンのうち1つを押下 したいのですが、そのような制御は可能でしょうか? Processで当該C++のexeを実行した後にどのような API?で実装できるのか、ご教示頂きたく。 できるんでしょうか?^^; | ||||
|
投稿日時: 2009-03-11 01:25
C++ といってもいろいろありますが C++/CLI ではないですよね? いろいろ方法は考えられます。 C++ 側の変更が可能であれば起動時のパラメータが特定の値の時にその Button が押下された時の処理を実行できます。 もう少し情報を提示すれば最適な解が得られるでしょう。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2009-03-11 09:36
===>じゃんぬねっとさん
お世話さまです。 早速のレス、ありがとうございます。 じゃんぬさんのサイト、開発時にいつも参考にさせて頂いております。^^ >C++ といってもいろいろありますが C++/CLI ではないですよね? VB5の頃のStudioにバンドルされたモノですので違うかと。^^; 但し、やっかいなことにこのC++のソースが編集&リビルド不能でして 現状のexeファイルに変更は加えられないのです。 このC++のexeはClientプログラムとWinSockでデータ通信を行う サーバプログラムになっておりまして、開始ボタンと終了ボタン がついていて、開始ボタンを押して初めて待機状態になる という代物でして、VB側でこのプログラムを起動後に 開始ボタンを押下したいワケです。 現状はサードパーティの製品(ScriPlayer)で一連のタスクを 自動化しているのですが、この機能をVBで実装したいのです。 何かよい方策がございましたらご教示お願い致します。m()m | ||||
|
投稿日時: 2009-03-11 10:04
当該C++アプリのフォームの表示状態を補足致します。
1.当該フォームは画面中央に表示される。 2.当該フォーム表示時は押下したい開始ボタンがFocusされている。 素人考え的には、Processで起動してWaitForInputIdleで待って 当該フォームをActiveにしてClickイベントを発生させれば それで終わりのような気がするのですが、やり方が解らない。^^; | ||||
|
投稿日時: 2009-03-11 13:19
C++ のアプリがダイアログでしたら、API を使う方法はどうでしょうか?
uint BM_CLICK = 0x00F5; IntPtr hWnd = FindWindow(0, "C++アプリのフォーム名"); SendDlgItemMessage(hWnd, 押したいボタンのID, BM_CLICK, 0, 0); // IDはC++のソースを見る API の定義はこの辺で調べてみて下さい。 | ||||
|
投稿日時: 2009-03-11 13:23
Active にして Key を送信してでも可能ではありますが、毎回正しく動作する保証がありません。 WinAPI になってしまいますが SendMessage 関数で BM_CLICK を飛ばすのがまだマシかなと思います。 対象の Handle は FindWindowEx 関数で調べることになると思います。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2009-03-11 13:33
===>ひでたつさん
早速のレス、ありがとうございます。 残念ながらソースがないのでIDも判らないんです。^^; 後述のじゃんぬさんのレスにもあったBM_CLICKがヒントになりそうです。 ご教示ありがとうございました。m()m | ||||
|
投稿日時: 2009-03-11 13:38
===>じゃんぬねっとさん
レス、ありがとうございます。 >Active にして Key を送信してでも可能ではありますが、毎回正しく動作する保証がありません。 なるほどー、実は座標を表示する別プログラムを作って 当該フォームのボタンの座標を別途^^;取得し、それを パラメータとして読み込んでSendInputするというのをやって みたんですが、安定稼動という点で不安になっていたところです。 >WinAPI になってしまいますが SendMessage 関数で BM_CLICK を飛ばすのがまだマシかなと思います。 対象の Handle は FindWindowEx 関数で調べることになると思います。 ご教示頂いた関数を調べてやってみます。 ありがとうございました。 |