はじめまして
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”となっているのですが、これはどの環境でビルド(コンパイル)しても不変なのでしょうか?
不変だとしたら、クラス名を使えば悩まずに取得できると思うのですが・・・(実験済み)
No.1ベストアンサー
- 回答日時:
FindWindowExの中でGetWidnowTextを呼び出しているため失敗するのだと思いますよ
GetWidnowTextはプロセスを超えては取得できないようです
取得できたとしても間違ったデータを返す場合があるようです
MSDNなどの GetWindowTextを確認してみてください
プロセスを超えて子コントロールのテキストを取得する場合は
WM_GETTEXTを直接コントロールにSendMessageで送って取得するようにしないといけないようです
Spy++は GetWindowで子コントロールのハンドルを取得してタイトルの取得にはWM_GETTEXTをSendMessageで送っているのではないかと思われます
VB.NETのAppAのテキストボックスのデータを書き換えても起動時に設定してあったデータで無いと失敗するようです
ご回答有り難うございます。
redfox63さんのご回答をヒントに色々調べてみた結果、Zオーダーと言うものの存在を知り、VB.NETのAppAのテキストボックスのZオーダーをVisual Studio 2005のレイアウトツールバーで最前面にして、念のためTextBox1.BringToFront()を記述して(^^;、C#ではGetWindow(hWnd, GW_CHILD); で目的のテキストボックスのクラスを取得することが出来ました。
お陰でこれからは作業がはかどりそうです。
また、調べているうちに色々と勉強することも出来ました。
本当に助かりました。
有り難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# PC画面を録画するプログラムでdllの読み込みエラー 1 2023/04/22 08:31
- C言語・C++・C# C# で、あるフォルダー内にあるすべてのテキストファイルを別のフォルダーにコピーする。 4 2022/11/21 13:23
- その他(プログラミング・Web制作) ボールの動きがスムーズに動いてかつ目盛り線描画を維持するためには 4 2023/05/31 10:01
- Excel(エクセル) エクセルのマクロについて教えてください。 2 2023/02/20 14:46
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
このQ&Aを見た人はこんなQ&Aも見ています
-
新NISA制度は今までと何が変わる?非課税枠の拡大や投資対象の変更などを解説!
少額から投資を行う人のための非課税制度であるNISAが、2024年に改正される。おすすめの銘柄や投資額の目安について教えてもらった。
-
VB.netでFindWindowExやると・・・9222812402616107008!?
Visual Basic(VBA)
-
(UWSC) 「#32770」の意味わかりますか?
その他(プログラミング・Web制作)
-
C#で自分のウインド・ハンドルを取得するにはどうすればよいのでしょうか
C言語・C++・C#
-
-
4
Alt+P,Alt+NをPostmessageで送るには
Visual Basic(VBA)
-
5
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
6
他のウィンドウのボタンを自動的に押したい
C言語・C++・C#
-
7
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
8
FindWindowの戻り値が違う!?
C言語・C++・C#
-
9
GetWindowTextでアドレスバーからURLを取得したい
Visual Basic(VBA)
-
10
VB.netでSendMessageを使用して電卓を閉じたい
Visual Basic(VBA)
-
11
別のアプリケーションのテキストフィールドに入力する方法
Visual Basic(VBA)
-
12
フルパスから最後のディレクトリ名を取得したい。
Visual Basic(VBA)
-
13
VB.NETのSendMessageを教えてください
Visual Basic(VBA)
-
14
自作アプリからAPIで他のアプリとデータやり取り
その他(プログラミング・Web制作)
-
15
C#でSendInputを使ったサンプルを動かそうとしているのですが、よくわかりません
C言語・C++・C#
-
16
C#で動的に作ったtextboxを消す。
C言語・C++・C#
-
17
インスタンス参照でアクセスできない。代わりに型名?
C言語・C++・C#
-
18
【C++】関数ポインタの使い方
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「取得先」という表現について
-
format関数について
-
Yahoo! JAPAN IDを新規取得でき...
-
VBAでPDFファイルの文書のプロ...
-
不正競争防止法に該当するので...
-
IEを使わないでhtmlテキストを...
-
ミュージックのアートワークを...
-
自動車教習所について 質問 普...
-
【VBA】EXCELブックを開かずに...
-
PDOを使った総レコード数(行数...
-
vbsで取得した値をvb.netで受け...
-
Symfonyのcriteriaで複数のSQL
-
C# ASP.NET でIPアドレスからア...
-
curlで取得出来るデータの制限...
-
perl LWPでURLにアクセスした時...
-
VBS「開いているページ」のURL...
-
PHP の cURL で、htmlを画像へ...
-
各クライアントマシンのログイ...
-
【C#】FindWindowExの使い方を...
-
PDFLibで解像度取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Yahoo! JAPAN IDを新規取得でき...
-
「取得先」という表現について
-
Excel VBA:特定の文字列以降(...
-
ps3で久しぶりにCDの音楽情報取...
-
format関数について
-
VB.NETでボリュームを取得・設...
-
アクセスの度にIPアドレスを変...
-
ローカルのコンピュータ名を取...
-
VBAでPDFファイルの文書のプロ...
-
【VBA】EXCELブックを開かずに...
-
ミュージックのアートワークを...
-
VBAでPDFのアクティブページ番...
-
EXCEL、マクロ-改ページ行番号...
-
別サイトのHTML内にある情報を...
-
自動車教習所について 質問 普...
-
表示している画面サイズの取得方法
-
IPアドレスとMACアドレスを取得...
-
VBAでできますか?
-
バッチファイルでPCのモデル名...
-
APIから取得した情報の文字化け...
おすすめ情報