質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

2814閲覧

C# FindWindowExでウインドウハンドルを取得できない

spweek2022

総合スコア2

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2022/10/30 14:50

編集2022/10/30 14:53

自動ログインするプログラムを作成しています。

↓を参考にプログラムを作成
https://dobon.net/vb/dotnet/process/enumwindows.html

実現したいこと

ユーザー名とパスワードを自動的に入力して、ログインボタンを自動的にクリックしたい。

発生している問題・エラーメッセージ

クラス名static が複数あり、そのなかのUsernameに値を入れたいのですが、
FindWindowExでウインドウハンドルが取得できない。

該当のソースコード

C#

1 private static bool EnumWindowCallBack(IntPtr hWnd, IntPtr lparam) 2 { 3 //ウィンドウのタイトルの長さを取得する 4 int textLen = GetWindowTextLength(hWnd); 5 if (0 < textLen) 6 { 7 //ウィンドウのタイトルを取得する 8 StringBuilder tsb = new StringBuilder(textLen + 1); 9 GetWindowText(hWnd, tsb, tsb.Capacity); 10 11 if (tsb.ToString() == "XXXXX") 12 { 13 //ウィンドウを作成したプロセスのIDを取得する 14 int processId; 15 GetWindowThreadProcessId(hWnd, out processId); 16 //processのオブジェクトを作成する 17 System.Diagnostics.Process p = Process.GetProcessById(processId); 18 19       //↓ここでウインドウハンドルが取得できていない(0) 20 IntPtr hWndc1 = FindWindowEx(hWnd, IntPtr.Zero, "Static", "Username"); 21 StringBuilder sb = new StringBuilder(256); 22 sb.Append("aaaa"); 23 SendMessage(hWndc1, WM_GETTEXT, 255, sb); 24 return true; 25 } 26 //ウィンドウのクラス名を取得する 27 StringBuilder csb = new StringBuilder(256); 28 GetClassName(hWnd, csb, csb.Capacity); 29 30 //結果を表示する 31 Console.WriteLine("クラス名:" + csb.ToString()); 32 Console.WriteLine("タイトル:" + tsb.ToString()); 33 } 34 35 //すべてのウィンドウを列挙する 36 return true; 37 }

試したこと

補足情報(FW/ツールのバージョンなど)

イメージ説明### 前提

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KOZ6.0

2022/10/30 15:32 編集

作り方は問題なさそうな気がしますが、API の宣言部分も載せてください。 気になるところを挙げておきます。 (1) 自プログラムについて ・ターゲットフレームワークは何ですか? ・32/64ビットどちらで動いていますか? ・FindWindowEx の第3引数を null にしてみたり、EnumChildWindows で hwnd 以下の子ウインドウを列挙してみたりするとどうでしょう? (2) 対象となるウインドウについて ・ウインドウを持っているプロセスは 32/64ビット どちらですか? ・ANSI/Unicode どちらのウインドウでしょうか?(IsWindowUnicode で確認できます。) EnumChildWindows https://learn.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-enumchildwindows IsWindowUnicode https://learn.microsoft.com/ja-jp/windows/win32/api/winuser/nf-winuser-iswindowunicode 以上です。 質問を編集して追記してください。
spweek2022

2022/10/30 15:38

ご回答ありがとうございます。 確認します。
KOZ6.0

2022/10/30 15:38

あ、テキストをセットするのは Username の次の Edit ですよね?
KOZ6.0

2022/10/30 21:31 編集

手元の環境でちょっとやってみたのですが、VB6 の TextBox を探すことができました。 ANSI/Unicode は関係ないかもしれません。
KOZ6.0

2022/10/30 22:07 編集

ウインドウは Username: になってませんか?(コロンが後ろについている)
spweek2022

2022/10/31 13:55

ありがとうございます。 Editのほうですね。勘違いをしておりました。 できました。
guest

回答1

0

自己解決

[before]
IntPtr hWndc1 = FindWindowEx(hWnd, IntPtr.Zero, "Static", "Username");
StringBuilder sb = new StringBuilder(256);
sb.Append("aaaa");
SendMessage(hWndc1, WM_GETTEXT, 255, sb);


[After]
IntPtr hWndc1 = FindWindowEx(hWnd, IntPtr.Zero, "Edit", "");
StringBuilder sb = new StringBuilder(256);
sb.Append("aaaa");
SendMessage(hWndc1, WM_SETTEXT, 0, sb);

投稿2022/10/31 13:55

spweek2022

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問