プロが教えるわが家の防犯対策術!

はじめまして
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 回答 (1件)

FindWindowExの中でGetWidnowTextを呼び出しているため失敗するのだと思いますよ



GetWidnowTextはプロセスを超えては取得できないようです
取得できたとしても間違ったデータを返す場合があるようです
MSDNなどの GetWindowTextを確認してみてください

プロセスを超えて子コントロールのテキストを取得する場合は
WM_GETTEXTを直接コントロールにSendMessageで送って取得するようにしないといけないようです

Spy++は GetWindowで子コントロールのハンドルを取得してタイトルの取得にはWM_GETTEXTをSendMessageで送っているのではないかと思われます

VB.NETのAppAのテキストボックスのデータを書き換えても起動時に設定してあったデータで無いと失敗するようです
    • good
    • 0
この回答へのお礼

ご回答有り難うございます。
redfox63さんのご回答をヒントに色々調べてみた結果、Zオーダーと言うものの存在を知り、VB.NETのAppAのテキストボックスのZオーダーをVisual Studio 2005のレイアウトツールバーで最前面にして、念のためTextBox1.BringToFront()を記述して(^^;、C#ではGetWindow(hWnd, GW_CHILD); で目的のテキストボックスのクラスを取得することが出来ました。
お陰でこれからは作業がはかどりそうです。

また、調べているうちに色々と勉強することも出来ました。

本当に助かりました。
有り難うございました。

お礼日時:2008/09/07 00:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A