DOBON.NET DOBON.NETプログラミング掲示板過去ログ

他アプリの子ハンドルの取得

環境/言語:[VB.NET Framework3.5]
分類:[.NET]

FindWindowEx関数で他アプリケーションの子ハンドルを取得して
sendmessage関数で値を送ろうと思っています
送ろうと思ってるのはTextBoxなのですがフォームに複数あります
このままでも値は送れているのですが、先頭のTextBoxになってしまいます
リファレンス見るとFindWindowExの第4引数でキャプション指定との事ですが
TextBoxのTextを指定しても失敗してしまいます。
どうにか目的のTextBoxのハンドルを取得できないでしょうか?
よろしくお願いします


Dim lpClassName As String = Nothing
Dim lpWindowName As String = "app1"
Dim hWnd As Long
Dim hWnd_c As Long

hWnd = FindWindow(lpClassName, lpWindowName)
If (hWnd = 0) Then
Else
hWnd_c = FindWindowEx(hWnd, 0, "ThunderRT5TextBox", 0)
If (hWnd_c = 0) Then
Else
SendMessage(hWnd_c, WM_SETTEXT, 0, "メッセージ")
End If
End If
> Dim hWnd As Long
> Dim hWnd_c As Long
64bit プロセスでなければ扱えなくなりますが、大丈夫でしょうか?
ハンドルの類は IntPtr を使用することをお勧めします。
FindWindowEx の第二引数とかもです。

取り敢えず、Spy++ なり Winspector なり使って、目的のアプリケーションの構造及びウィンドウクラス名は確認されていますか?
目的の TextBox のウィンドウクラス名は ThunderRT5TextBox で間違いありませんか?
目的の TextBox は FindWindow で見つけたトップレベルウィンドウの直下に存在していますか? ほかのウィンドウが親子関係の間に入っていたりしませんか?
「TextBox の Text」ってのは、この目的の TextBox に今現在入っている文字列って事で良いんでしょうかね?
2010/04/22(Thu) 09:25:22 編集(投稿者)

#本題ではないところの指摘だけですが・・・

■No26739に返信(ぱのやねさんの記事)
> Dim hWnd As Long
> Dim hWnd_c As Long

このコードってVB6以前のVBのソースコードから流用していますか?
もしそうなら、VB7以降(VB.NET2002以降)では型のサイズが変更になっているため、
VB6以前のLong型(32bit)に対応するデータ型はInteger(32bit)になります。(VB.NETのLongは64bit)

(今回の用途の場合は、Hongliangさんのご指摘の通りInteger/LongではなくIntPtr型を利用した方がよいですね。)
> 64bit プロセスでなければ扱えなくなりますが、大丈夫でしょうか?
> ハンドルの類は IntPtr を使用することをお勧めします。
> FindWindowEx の第二引数とかもです。
そうなのですが、気を付けます親切にありがとうございます。

> 取り敢えず、Spy++ なり Winspector なり使って、目的のアプリケーションの構造及びウィンドウクラス名は確認されていますか?
> 目的の TextBox のウィンドウクラス名は ThunderRT5TextBox で間違いありませんか?
> 目的の TextBox は FindWindow で見つけたトップレベルウィンドウの直下に存在していますか? ほかのウィンドウが親子関係の間に入っていたりしませんか?
Spy++持っていないのでWinspectorで確認いたしました。
クラス名は先頭のTextBoxが反応していることからも間違いありません、またWinspectorで見たところTextBoxはFormの直下に存在しています。

> 「TextBox の Text」ってのは、この目的の TextBox に今現在入っている文字列って事で良いんでしょうかね?
はい、キャプションということなのでTextBoxの場合はTextで反応するかと思ったのですが・・・と書いたところで文字列?と思って試してみました
キャプションはウインドタイトルということでウインド生成時の最初の文字列ではないのか?ということに気付いて、確認してみてプログラムは起動後レジストリから値を読み込んでるみたいだったのでレジストリを削除、最初の値をキャプションに指定してみたところ反応してくれました。
解決できました!ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板