- PR -

VBからC++のフォームを起動してフォーム上のボタンを押下したい

投稿者投稿内容
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2009-03-10 22:14
お世話さまです。

VB.NET2005のウインドウフォームからC++のウインドウフォームを起動し、
そのフォーム上にある2つのボタンのうち1つを押下
したいのですが、そのような制御は可能でしょうか?

Processで当該C++のexeを実行した後にどのような
API?で実装できるのか、ご教示頂きたく。

できるんでしょうか?^^;
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2009-03-11 01:25
引用:

moondogさんの書き込み (2009-03-10 22:14) より:

できるんでしょうか?^^;


C++ といってもいろいろありますが C++/CLI ではないですよね? いろいろ方法は考えられます。 C++ 側の変更が可能であれば起動時のパラメータが特定の値の時にその Button が押下された時の処理を実行できます。 もう少し情報を提示すれば最適な解が得られるでしょう。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2009-03-11 09:36
===>じゃんぬねっとさん

お世話さまです。
早速のレス、ありがとうございます。

じゃんぬさんのサイト、開発時にいつも参考にさせて頂いております。^^

>C++ といってもいろいろありますが C++/CLI ではないですよね?
VB5の頃のStudioにバンドルされたモノですので違うかと。^^;

但し、やっかいなことにこのC++のソースが編集&リビルド不能でして
現状のexeファイルに変更は加えられないのです。

このC++のexeはClientプログラムとWinSockでデータ通信を行う
サーバプログラムになっておりまして、開始ボタンと終了ボタン
がついていて、開始ボタンを押して初めて待機状態になる
という代物でして、VB側でこのプログラムを起動後に
開始ボタンを押下したいワケです。

現状はサードパーティの製品(ScriPlayer)で一連のタスクを
自動化しているのですが、この機能をVBで実装したいのです。

何かよい方策がございましたらご教示お願い致します。m()m
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2009-03-11 10:04
当該C++アプリのフォームの表示状態を補足致します。

1.当該フォームは画面中央に表示される。
2.当該フォーム表示時は押下したい開始ボタンがFocusされている。

素人考え的には、Processで起動してWaitForInputIdleで待って
当該フォームをActiveにしてClickイベントを発生させれば
それで終わりのような気がするのですが、やり方が解らない。^^;
ひでたつ
常連さん
会議室デビュー日: 2002/08/09
投稿数: 28
お住まい・勤務地: 岩手県
投稿日時: 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 の定義はこの辺で調べてみて下さい。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2009-03-11 13:23
引用:

moondogさんの書き込み (2009-03-11 10:04) より:

素人考え的には、Processで起動してWaitForInputIdleで待って
当該フォームをActiveにしてClickイベントを発生させれば
それで終わりのような気がするのですが、やり方が解らない。^^;


Active にして Key を送信してでも可能ではありますが、毎回正しく動作する保証がありません。 WinAPI になってしまいますが SendMessage 関数で BM_CLICK を飛ばすのがまだマシかなと思います。 対象の Handle は FindWindowEx 関数で調べることになると思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2009-03-11 13:33
===>ひでたつさん

早速のレス、ありがとうございます。

残念ながらソースがないのでIDも判らないんです。^^;
後述のじゃんぬさんのレスにもあったBM_CLICKがヒントになりそうです。

ご教示ありがとうございました。m()m
moondog
大ベテラン
会議室デビュー日: 2003/04/11
投稿数: 165
投稿日時: 2009-03-11 13:38
===>じゃんぬねっとさん

レス、ありがとうございます。

>Active にして Key を送信してでも可能ではありますが、毎回正しく動作する保証がありません。

なるほどー、実は座標を表示する別プログラムを作って
当該フォームのボタンの座標を別途^^;取得し、それを
パラメータとして読み込んでSendInputするというのをやって
みたんですが、安定稼動という点で不安になっていたところです。

>WinAPI になってしまいますが SendMessage 関数で BM_CLICK を飛ばすのがまだマシかなと思います。 対象の Handle は FindWindowEx 関数で調べることになると思います。

ご教示頂いた関数を調べてやってみます。
ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)