• 締切済み

ウインドウハンドルのつかみ方について質問です。

visualbasic6.0で開発をしています。 例えば、同親内の子コントロールに同じ「edit」クラスが2つ存在していたとします。 私は、ハンドルを掴むのにクラス名とキャプション名で掴んでいます。 しかし、クラス名は一緒で、キャプション名は存在しません。 すると、2つのコントロールを区別することができません。 現在は、FindWindowExで取得したハンドルを、アプリケーション「spy」等であっているか確認しています。 上記のような、クラス名とキャプションで判断できないものは、皆さんどのようにハンドルを取得していますか? 自分のように順次取得して、順番で判断していますか? だとしたら、FindWindowExで取得した順番はOS環境や、取得する時々で変わったりしないモノなのでしょうか? よろしくお願いします。

みんなの回答

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.7

コントロールIDでも一意とは限らないんですけども。 staticコントロールなんて固定の文字列だったら慣例的に-1だし、意識的に同じコントロールID振ることも出来ます。 もちろん位置やサイズも一意になるかといわれると確実にはならないですけどね。 でもどちらが確実かといわれると位置になると思いますよ。

  • piyo2000
  • ベストアンサー率49% (144/293)
回答No.6

確かにControlIDでもよさそうですね(^^; >具体的にControlIDを指定してハンドルを掴む行為はどのような、API?を使用すればよろしいのでしょうか? #5さんが紹介しているGetDlgCtrlID()を使えばいいですね。 またはGetDlgItem()とか。 FindWindowEx()でコントロールのhwndを列挙しながら、GetDlgCtrlID()でコントロールIDをチェックしていく、と言う感じになると思います。 親ウインドウのHWND&コントロールIDが分かっていれば、GetDlgItem()でもOKだと思います。

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.5

こんとろーるあいでぃ

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=894824
  • 2ch
  • ベストアンサー率51% (64/125)
回答No.4

コントロールIDに一票

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

コントロールID

HITPOINT100
質問者

補足

自アプリ以外のアプリケーションのハンドルを掴みたいのですが、具体的にControlIDを指定してハンドルを掴む行為はどのような、API?を使用すればよろしいのでしょうか? よろしくお願いします。

  • piyo2000
  • ベストアンサー率49% (144/293)
回答No.2

「edit」とあるところからも、VC++等で作成された他アプリのWindowハンドルを取ってくる、というのが目的なのでしょうか? そもそもTextBoxであればhwndプロパティがありますからこのような心配は無用ですからね(^^; >2つのコントロールを区別することができません。 私なら、あまりスマートではないですが、editコントロールということでクライアント座標から判断しますね。 クライアント座標はOS環境やデスクトップサイズ等では変わりません(そういう仕様にしてあれば別の話ですが)から。

HITPOINT100
質問者

お礼

やっぱりあとは座標ですかねぇ

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

あとは位置くらいですかね。判断材料は。

HITPOINT100
質問者

お礼

やっぱりあとは座標ですかねぇ ありがとうございます

関連するQ&A

  • 子ウインドウを特定する

    VisualBasic2008Expressでプログラミングをしています。 楽天ツールバーの検索窓のハンドルを取得してsendmessageで文字列を送るプログラムを作ろうとしています。 UISpy.exeで調べてところ"edit"というクラス名で深い階層にあるようで、FindWindowExでは取得できないようです。なので下のURL http://homepage2.nifty.com/nonnon/SoftSample/VB.NET/SampleEnumWindows.html のコードを基に検索窓のクラス名"edit"からハンドルを取得できるように作り替えようと思っています。 ですが、このenumChildWindowsやGetClassNameの使い方が全く分からない。FindWindowExの場合は、クラス名とタイトル名を指定すればハンドルが返ってくるのですが、これはコールバック関数やポインタが出てきてどう扱えばいいのかが分からず手が出せない状態です。 列挙された子ウインドウの中からクラス名"edit"を特定してハンドルを取得するには、どのようにコードを作り直せばよいのでしょうか。何も分からない状態でお手数をおかけするでしょうが、どうかよろしくお願いします。

  • C++ 子ウィンドウのハンドルを取得したいのですが

    C++で別ウィンドウのアプリケーションを動かすというものを作っているのですが、そのウィンドウの子ウィンドウのハンドルを取得するのに困ったことがあるのでアドバイスをいただけると大変ありがたいです。 基本的にSPY++というソフトを使ってウィンドウ名その他を探し、FindWindowExまたはGetDlgItem関数を使って取得という方法をとっているのですが、クラス名、ウィンドウ名が全く同じもので、コントロールIDも0という状態のものがあり、片方を取得したい場合どうしたらよいのかという状態です。 知人にSPY++でみて上から何番目にあるやつと指定して得ることができる方法があるかもしれないと聞いたのですが、よくわかりません。 例としてその画像ものせますので、良い知恵がありましたらお貸しください。

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

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

  • VBAでウィンドウのキャプションとフルパスを取得

    ExcelVBAを用いて、以下のことをやりたいと考えています。 (1)全ウィンドウのハンドルを取得する。 (2)取得したハンドルを、可視ウィンドウのハンドルのみに絞り込む (3)ハンドルから、ウィンドウのキャプション、ファイル名を含むフルパスの2つを抽出する。 (4)Excelのセルへ 「キャプション フルパス ハンドル」 の順に横に並ぶように出力する。 (5)Excelの行を下へ移動する。 (6)(3)~(6)を、全ての可視ウィンドウに対して順に行う。 結果としては 1つめのキャプション 1つめのフルパス 1つめのハンドル 2つめのキャプション 2つめのフルパス 2つめのハンドル 3つめのキャプション 3つめのフルパス …… と結果出力を行いたいと考えています。 まず、他の質問サイトなどの過去暦も含めて探ってみました。 その結果、全可視ウィンドウのキャプションを取得する方法とアクティブウィンドウのフルパスを取得する方法がそれぞれ見つかったのですが、自分なりに組み合わせても上手く動作しませんでした。 なんとか、解決方法を教えていただければと思います。

  • 【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”となっているのですが、これはどの環境でビルド(コンパイル)しても不変なのでしょうか? 不変だとしたら、クラス名を使えば悩まずに取得できると思うのですが・・・(実験済み)

  • ウィンドウにキー送信で ENTER を送りたい

    指定されたキャプションのウィンドウに ENTERキーを送りたいのですが、ものによって送れるものと送れないものがあります。 キャプションが"印刷"のものにキー送信をしているのですが、ExelやWordなどのクラス名が取得できる("bosa_sdm_XL9"等)ものだと送信でき、IE、秀丸などのクラス名が取得できないもの("#32770"と表示される)だと送信できません。 お分かりになられる方がおりましたら、ぜひ教えてください。

  • FinderSystem等のツールで取得できないハンドルを取得するには?

    他のアプリケーションのボタンで操作したいと思い FinderSystemやNuke++等のツールを使いウィンドウハンドルを調べ SendMessage関数を使ってコマンドボタンのクリックをする所までは できるのですが、ツール等でウィンドウハンドルを取得できないラベル トグルボタンが存在し、画面上では明らかに存在しているのですが そのボタンには反応せず、大きな枠組みでウィンドウハンドルを 取得してしまいます。FindWindow、FindWindowEx、GetWindow EnumChildWindowで子ウィンドウのハンドルまで調べたのですが 値が0になってしまいます。他にもボタンだけではなく タブコントロールも操作したいと思っているのですが 同様に子ウィンドウハンドルの値は0になってしまいます そもそもウィンドウハンドルを全て取得することは不可能なのでしょうか? いろいろな他のアプリケーションのコマンドボタンをFinderSystemで調べて 取得できる場合とできない場合があり、この差は何なのか 疑問に思っています。ご存知のお方がいれば お手数ですが教えていただけないでしょうか? 開発環境は、WindowsXP、VB6.0です。 宜しくお願いいたします。

  • ウインドウの取得

    かんたんYouTubeプレーヤーというソフトのウインドウハンドルを取得し、プレーヤーウインドウのサイズや位置を変更するプログラムをVB2008で作成しようとしました。このプレーヤーはリストウインドウとプレーヤーウインドウの二つがあるのですが、窓ちぇき!というソフトでタイトルとクラス名を調べたら二つとも同じタイトルとクラス名になっていました。これだとFindWindow関数でウインドウハンドルを取得できません。どうすればよいでしょうか。

  • 有効でないウインドウハンドルを指定したSendMessageは安全?で

    有効でないウインドウハンドルを指定したSendMessageは安全?では無いでしょうか?  あるサブスレッドの処理進捗状況を、あるサブウインドウに貼り付けた プログレスバー・コントロールに「現在~%」などと表示しています。 サブスレッド内からSendMessageでこのプログレスバーコントロールに 数値を送信しているのですが、 プログレスバーが貼りついているサブウインドウはユーザーが 閉じるボタンなどを押して任意に閉じたり開いたり出来るものに なっています。 それでもし「閉じる」でサブウインドウが破棄されたとき 当然その子ウインドウであるプログレスバーコントロールのハンドルも有効な ものでなくなっています。 このときスレッドで実行されるSendMessageは安全なものでは なくなっているのでしょうか? SendMessageを送る直前でif判定などでコントロールのハンドルが 有効かどうか調べるようにも考えたのですが 「調べて有効だと判断した直後」に破棄されて、それからSendMessageが実行される という場合も可能性としてあるなら、直前での判定は意味が無いことになります。 (現在はウインドウを閉じる時、破棄するのでは無くSW_HIDEなどとして、ただ隠すだけに しているのですがどうもスッキリした方法では無いなと思い。 本当にサブウインドウがいらない場合でも居座り続けるので。。) SendMessage命令自体が、仮に送信先が存在しない場合でも安全に終えてくれるという 前提があれば簡単で良いのですが、このような場合どのようにするべきでしょうか。

  • windows7のエクスプローラをVBAで操作-1

    アドバイスをお願いします。 Excel-VBAで起動しているエクスプローラに対してハンドルを取得してクリックしたり、テキストボックスに文字をセットするプログラムを作って動かしています。 WindowsXPのときはできていたのですが、Windows7になったら正しく動作しなくなりました。 下のコードはエクスプローラの現在のフォルダパスが表示されるところに(添付ファイル参照)文字を入れるものです。 最後のSendMessageAnyで1が返ってしまいます。何が考えられますでしょうか。どう対策したらいいでしょうか。 なおハンドルの値はSDKのInspect Objectsで確認していますので、正しく取得できていると思っています。 よろしくお願いします。 Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _ ByVal hwndParent As Long, _ ByVal hwndChildAfter As Long, _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As Long Declare Function SendMessageAny Lib "user32.dll" _ Alias "SendMessageA" _ (ByVal hwnd As Long, _ ByVal MSG As Long, _ ByVal wParam As Long, _ ByVal lParam As Any) As Long Const WM_SETTEXT = &HC Private hwnd As Long Private FOLDER As String Sub Put_folder_name1() hwnd = FindWindow("CabinetWClass", vbNullString) hwnd = FindWindowEx(hwnd, 0, "WorkerW", vbNullString) hwnd = FindWindowEx(hwnd, 0, "ReBarWindow32", vbNullString) hwnd = FindWindowEx(hwnd, 0, "Address Band Root", vbNullString) hwnd = FindWindowEx(hwnd, 0, "msctls_progress32", vbNullString) hwnd = FindWindowEx(hwnd, 0, "ComboBoxEx32", vbNullString) hwnd = FindWindowEx(hwnd, 0, "ComboBox", vbNullString) hwnd = FindWindowEx(hwnd, 0, "Edit", vbNullString) FOLDER = "\\xx.xx.xx.xx\test" RC = SendMessageAny(hwnd, WM_SETTEXT, 0, ByVal FOLDER) end sub

専門家に質問してみよう