はじめまして。VB .NET初心者のはるかといいます。
実はVB .NETで作成した画面内の特定のテキストボックスに対して、別のプログラム(VB 6.0で自己作成)から、その.NETの画面が表示された時に、自動的に値をセットして、ボタン押下するという処理をしたいのですが、VB .NETで作成されたテキストボックス、ボタンコントロールを識別するコントロールIDが取れないので困っております。
VB、VC 6.0ではフォームに作成したテキストボックス、ボタン等のコントロールIDという固定の値が、Spyで取れたのですが、.NETでは無理なのでしょうか?
使用言語は、値をセットするプログラムがVB 6.0 Exe
画面を表示するプログラムが VB .NET (2003)のActiveX DLL
OSはWindows2000、またはXPです。
つたない説明で申し訳ありませんが、どなたかよい方法をご存知ではないでしょうか?よろしくお願い致します。
[VB.NET2003]をインストールしたのであれば、ツールに
Spy++ってあると思いますが。。。
特攻隊長まるるう様
回答ありがとうございます。
そのSpy++で見たところ、.NETで作成した画面のコントロールのIDの値は、コントロールのウィンドウハンドルと同一で、画面を起動する毎に動的に変わります。ですから、テキストボックスに自動入力を行う6.0のプログラムから固定で指定してSendMessageで文字列をセットするということができなくて困っています。
何か.NET側から画面表示の際のコントロールIDを外部プログラムに伝える方法等は、ないものでしょうか?
それとも、.NETの画面の作成方法が悪いのでしょうか?
よろしくお願い致します。
> 何か.NET側から画面表示の際のコントロールIDを外部プログラムに伝える方法等は、ないものでしょうか?
そこまでくると、コントロールIDを外部に出すより、テキストボックスに
テキストを設定するメソッドを公開した方が良い気がしますが?
DLL(クラスライブラリ)を作るとか。
異なるプロセス間のデータのやり取りでは
『共有メモリ』というのが結構有名かも?
関連キーワード:
『メモリマッピング』『ファイルマッピング』『メールスロット』
まぁ、色々ありますので、過去ログやWEBで一通り検索してみてください。
特攻特攻隊長まるるう様
度々、ありがとうございます。共有メモリやプロセス間通信も考えたのですが、全体に与える影響が大きいので、なるべく簡単な方法を探しておりました。
>そこまでくると、コントロールIDを外部に出すより、テキストボックスに
>テキストを設定するメソッドを公開した方が良い気がしますが?
>DLL(クラスライブラリ)を作るとか。
ちなみに参考までに、上記の方法を.NETとVB6.0で実装するとしたら、.NET側で公開したテキスト設定の外部公開メソッドはどのような感じに作ればよいのでしょうか?また、6.0側でそのクラスを呼出すにはどうするのでしょうか?
もし、参考になるホームページ等をご存知でしたら、教えて頂けるとうれしいのですが・・・。
よろしくお願いします。
VB.NET のプログラムを変更できるなら、ショートカットキーを設定するとか。
VB6からEnumwindowで探すとか
花ちゃんさんの方法で、sendkeysが楽そうです。
VBレスキュー(花ちゃん)様、ヤマ@文系様ありがとうございます。
>VB6からEnumwindowで探すとか
今は、.NET側のメインウィンドウの表示を(ウィンドウタイトルで特定できるので)検索し、VB6側からEnumwindowで、そのウィンドウ内のテキストコントロールを順に探し出して、1つ目に指定コードを、2つ目には・・を、というように見つけたテキストボックスに対して、postmessageで入力処理をしています。.NETへの処理と同じ仕組みで、VB、VCで作成された画面に対しても自動入力等の制御を行いたいのと、その制御を行う画面が複数あるので、Enumwindowで逐一検索処理を行うと他の処理との関係で結構、負荷がかかってしまっていたので、Enumwindowで検索せずに、コントロールIDのようにあらかじめ固定の値でコントロールを特定できるプロパティや値のようなものが.NETにもないものかと探しておりました。
が、.NETにはそのような外部から指定できるようなものはないんですよね?
>が、.NETにはそのような外部から指定できるようなものはないんですよね?
ショートカットキーを設定する
ショートカットキーが早いと思います。
Enumwindowsを使う場合、
逐一探すのではなく、一度探したら、ハンドルを
キャッシュ化しておけばいいのではないでしょうか?
(EnumWindowsでした。すいません)
自分が起動する時に、メモリマップドファイルか、
それが面倒なら、ファイルに必要なテキストボックスの
ハンドルを書き付けておけば良いのでは。
SendKeysの場合はSetForegroundWindowかAppActivateで
一度送る側のアプリにフォーカスを当てなければいけないので
複数のアプリを一度に処理のは難しいかも。
返事遅くなり申し訳ありません。
VBレスキュー(花ちゃん)様、ヤマ@文系様、我龍院忠太様、皆様、貴重なアドバイスありがとうございます。
>ショートカットキーを設定する
VBレスキュー(花ちゃん)様、ヤマ@文系様、折角いい案を教えて頂いたのに、きちんとこちらの状況をお伝えできておらず、申し訳ありません。
自動入力の対象の.NETの画面が1個だけならこの方法がベストなのですが、画面を表示する部分を.NETのActiveX DLLで作成して、それを複数の画面で参照して共通で使用しています。複数の場合、フォーカスをあててからSendKeys送信の際に、ユーザ操作とかで他の画面にフォーカスを当てられてしまうとうまくいかない場合があり、制御が確実ではないので断念しました。
>自分が起動する時に、メモリマップドファイルか、
>それが面倒なら、ファイルに必要なテキストボックスの
>ハンドルを書き付けておけば良いのでは。
我龍院忠太様
最終的に.NETの画面が表示された際に、毎回ファイルに制御対象のコントロールのハンドルを出力して、それに対してpostmessageする方法でなんとかなりました。
皆様、いろいろと本当にありがとうございました。
ツイート | ![]() |