• 締切済み

他アプリのコントロール操作

2つのアプリA.exeとB.exeがあります。A.exeの特定のテキストボックスに入力された内容をB.exeで監視しようとしているのですが次の2点問題があります。 説明がうまくできないのですが回答をいただければと思います。よろしくお願いします。 1.FindWindowを使ってウィンドウハンドルを取得しようとしているが,同じウィンドウ名を持つA.exe以外のウィンドウが存在するとA.exeのウィンドウかどうか判断できない? 2.ウィンドウハンドルが取得できたとして,複数のテキストボックスがある場合,それぞれのテキストボックスを区別する方法は?

みんなの回答

  • todo36
  • ベストアンサー率58% (728/1234)
回答No.2

>説明がうまくできないのですが回答をいただければと思います。 それは無理でしょう。 でも説明がうまくできているので回答します。 >1. CreateToolhelp32SnapshotでA.exeのプロセスを探す。 そこからメインウインドウハンドルを取得できると思います(方法は不明)。 >2. コントロールID 過去ログで探して下さい

tonytonychopper
質問者

補足

回答ありがとうございます。 >CreateToolhelp32SnapshotでA.exeのプロセスを探す。 >そこからメインウインドウハンドルを取得できると思います(方法は不明)。 これに関しては試してみたいと思います。 ただ,A.exeから同一のウィンドウ名を持つものが複数存在した場合どのように判断が可能でしょうか? 説明不足でしたがA.exeは他社製品であるためさまざまは場合を想定しておいたほうがいいと思っています。 >コントロールID >過去ログで探して下さい これに関してはバッチリコントロールを識別できました。

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

FindWindow() Win32APIを使っているのなら、変わりに・・・・何だったっけ。忘れた。他の方法で窓を特定する方法があったはず・・・・。 それか、A.exeが必ず1つしか起動しないというのであれば、DDEを使ってみてはどうだろう。これは、質問1も質問2も同時に満足させるご機嫌な解ではないかと自画自賛だ。VBどうしだとDDEはとっても簡単なので、検討してみては。

tonytonychopper
質問者

補足

回答ありがとうございます。 FindWindow() 以外の方法を思い出したら,またお願いします。 説明不足でしたがA.exeは他社製品のため手をつけることが不可能なのです。それだとDDEは無理ですよね?

関連するQ&A

  • exeファイルをプログラムから操作する。

    お世話になります。 VisualStudio2019(C#またはVB)で下記を実装したいと思っています。 ①あるプログラム(1.exe)のフォーム内にいくつかある指定のボタンを押す。  ⇒ウィンドウを取得、ウィンドウハンドルを取得してボタン押下 ②①の操作でプログラム(2.exe)が起動する。 ③2.exeプログラムの複数あるテキストボックスの中から指定のテキストボックスに文字を入力  ⇒ウィンドウを取得、テキストボックスのウィンドウハンドルを取得してテキストに値をセット いろいろサイトを探したのですが、「まさにコレ」といったものがなく困っています。 もしご教授いただければ幸いです。 よろしくお願いいたします。

  • 別アプリ終了させる

    いつもお世話になります。 再度質問ですが、 A.EXEとB.EXEがあり、B.EXEはA.EXEからShellExecuteで起動させています。 起動したB.EXEからA.EXEを終了させたいのですが、それにはA.EXEの ウィンドウハンドルが必要になると思います。 このときにA.EXEのタイトルは動的に変更されるので、FindWindowは使えません。 そこでA.EXEからB.EXEを起動した時にhWNDを送ってやれば、B.EXEからA.EXEを 操作できるとおもいます。 hWNDを対象アプリに送りたいのですが、ShellExecuteやCreateProcessのパラメータにhWndを持たすことはできるのでしょうか? もたせることができそうですが、具体的にどう記述すればいいのかが わからないので、サンプルソースをつけていただければありがたいです。 見当違いであれば、別の方法をご教授ください。 よろしくお願いします。

  • 別アプリの終了について

    いつもお世話になります。 開発環境はVC++6.0MFCです。 以前にも質問させていただいたのですが、 A.EXEとB.EXEがあったとします。 A.EXEをB.EXEから終了させたい。 しかし、A.EXEのタイトル(キャプション)は動的に 変更があり、タイトルNULLの時もある。 私はFindWindowでウィンドウハンドルを取得し、WM_CLOSE を投げているのですが、この方法だと上記理由により、 不正動作になります。 どなたかこういう場合の解決方法をご存知の方、 ご教授よろしくお願い致します。

  • 【C#】FindWindowExの使い方を教えてください

    はじめまして Visual Studio 2005を使用しています。 C#.NETは、いじり初めて1週間の超初心者です。 C#.NETでのFindWindowExの使い方を教えてください。 まずはじめに、vb.netで作ったアプリAの"Form1"があり、その中にテキストボックス"TextBox1"があります。 "TextBox1"のテキスト(キャプション?)には同じく"TextBox1"と入力されています。 そこで、C#側のアプリBでVBのアプリAの"Form1"のハンドルをFindWindowで取得します。 ここまでは出来ました。 次に、FindWindowExを使って"TextBox1"のハンドルを取得したいのですが、どうしてもうまく取得できません(0が返ってきます) 以下、C#のソースです。 (textBox1のMultilineはTrueです) ================================================================== using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; namespace WindowsApplication1 { public partial class Form1 : Form { [DllImport("user32.dll")] static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32.dll")] static extern IntPtr FindWindowEx(IntPtr hWnd, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); public IntPtr hWnd = (IntPtr)0; public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { IntPtr hWnd; IntPtr hWndTest; string sClassName = null; string sWindowText = "AppA"; // アプリAのウインドウハンドルを取得 hWnd = FindWindow(sClassName, sWindowText); textBox1.Text = "ウインドウのハンドル " + hWnd + "\r\n"; // アプリAのウインドウ内のTextBox1のハンドルを取得 hWndTest = hWnd; sClassName = null; sWindowText = "TextBox1"; hWnd = FindWindowEx(hWndTest, IntPtr.Zero, sClassName, sWindowText); textBox1.Text += "テキストボックスのハンドル " + hWnd; } } } ================================================================== Spy++で覗くとテキストボックスにもハンドルが割り与えられているので取得できるはずだと思っているのですが、どうしてもいまくいきません。 どうか、よろしくご享受願います。 ちなみに、アプリAのテキストボックスのクラス名が”WindowsForms10.EDIT.app.0.378734a”となっているのですが、これはどの環境でビルド(コンパイル)しても不変なのでしょうか? 不変だとしたら、クラス名を使えば悩まずに取得できると思うのですが・・・(実験済み)

  • 他のアプリの表示、非表示について

    他のアプリケーション(アプリA)をコントロールするプログラムを作っています。アプリAと自作アプリは起動したままです。自作アプリでボタンを押すとアプリAを表示させてアクティブにして仕事をさせ、終わったら非表示にします。 アプリAのハンドルをhandle = FindWindow()で取得して ShowWindow(handle,SW_SHOWNORMAL)で表示して、 ShowWindow(handle,SW_HIDE);で隠しています。 ボタンを押したときに、アプリAが表示されていると、非表示にしたあとタスクバーのアプリを手動で表示できません。 MINIMIZEやCloseWindos()も試しましたが、それだと画面の左下にアプリAが残ってしまいます。 SendMessage(handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);も試しましたがうまくいきません。使い方が悪いのかもしれません。 アプリAを隠す事と元のサイズで表示する。という二つの動作をプログラムで交互に行う場合に、途中で手動でアプリAの最小化、あるいはタスクバーから出すという動作をさせることができるのが希望です。どうすればよいでしょうか。 OSはXPです。

  • 別アプリを終了させる

    以前にも同様の質問をさせていただいたのですが、 再度質問です。 A.EXEとB.EXEがあったとします。 B.EXEからA.EXEを終了させたい。 そこで、FindWindowでA.EXEのウィンドウハンドルを ゲット。 その後、WM_CLOSEメッセージを送るという流れなのですが、 どうも、終了する時と終了しない時があります。 1回目は必ず、終了させる事ができず、2回目以降は 終了します。 原因がわからず、困っております。 なにか良い解決策などがございましたら、ご教授ください。 よろしくお願い致します。

  • ウィンドウハンドルの取得方法

    ダイアログの表示されないEXEを起動させて、FindWindowを使用してそのEXEのウィンドウハンドルを取得したいのですが上手くいきません・・。 FindWindowの第一引数は「ウィンドウのクラス名」を指定するようなのですが、「ウィンドウのクラス名」の意味が良くわかりません。第二引数は「ウィンドウ名」を指定するようなのですが、今回のようなアンダーグラウンドで動くEXEには「ウィンドウ名」は無いと思ってよいのでしょうか? ちなみにダイアログのあるEXEならウィンドウハンドルを取得できます。 お分かりの方がいらっしゃれば、ご教授願います。

  • VC++2005での他のアプリ操作について

    VC++2005でWindowsフォームアプリケーション形式でプロジェクトを作成し、他の人が作成したWindow形式のtextboxやコンボボックスなどが存在するソフトを操作したいのですが、どなたかご教示いただけないでしょうか。 環境はOS:Windos vista 開発ソフト:Microsoft Visual Studio C++ 2005 です。 つい先日、同様の質問をし、 ”基本的にはFindWindow、EnumWindowとかでアプリケーションのトップウィンドウを探して、さらにEnumChildWindow、GetDlgItemとかでテキストボックスやコンボボックスを探して操作。 ボタンを押すのは、トップウィンドウに対してSendMessage(WM_COMMAND,~);とかでできるかと思います。” と教えていただいたのですがWindowsフォームアプリケーション形式では使えないような感じなのでどうすればいいのかわかりません。 大変困っています。よろしくお願い致します。

  • 他アプリのアクティブな子ウインドウを取得するには?

    他人の作ったあるフリーソフトがあるのですが、そのソフトには、テキストボックスが2つ存在していて、そのうち、現在キー入力を受け付ける状態にある方のテキストボックスのハンドルを取得したいと思っています。 つまり、アクティブな子ウインドウを取得したいということなのですが、そのようなことは可能でしょうか? 自作ソフトならばなんとか分かるのですが、他人の作ったものでは無理なのでしょうか? APIのGetForegroundWindowでは、トップレベルウインドウしか求めることが出来ないようですし。 よろしくお願い致します。

  • vbaから他のアプリを終了

    エクセルVBAから他のアプリを終了するマクロを書きたいのですが、途中で行き詰ってます。 Sub test() Dim h As Long h = FindWindow(vbNullString, "タイトル") Call SendMessage(h, 0, 0, "ALT+{F4}") End Sub FindWindowでハンドルを取得してALT+F4を送ればいいじゃないかと思ってますが ALT+F4の送り方がわかりません。どなたか教えてください。 また、ほかに良い方法があれば併せてご提案くださると幸甚です。 よろしくお願いします。 -- エクセル2003