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

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

新規登録して質問してみよう
ただいま回答率
85.49%
DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C#

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

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Q&A

解決済

1回答

1344閲覧

親ウィンドウに紐づいているパスワード入力ウィンドウ(ダイアログ)のウィンドウハンドルを取得したい。

Lvr642

総合スコア11

DLL

DLL(Dynamic Link Library)とは、他のモジュールからも使用する事が出来る、関数とデータが格納されているモジュールのことです。

C#

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

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

0グッド

1クリップ

投稿2018/01/24 05:27

###前提
1.暗号化されたファイルA(PDF)をクリックするとAdobe Acrobat Reader DCウィンドウが開き、その上にパスワード入力ダイアログが表示される。

2.spy++で解析してわかっていること

プロパティ
 【ウィンドウ名】Adobe Acrobat Reader DCウィンドウパスワード入力ウィンドウ
 【クラス名】AcrobatSDIWindow#32770
 【親ウィンドウ】なしAdobe Acrobat Reader DCウィンドウ
 【子ウィンドウ】いろいろ(ただし②のパスワード入力ウィンドウは入っておらず)RICHTEXTEDITERとかokボタン
 

 →まとめると、②のプロパティで確認すると親子関係になっているが、①を見ると子ウィンドウとして認識していない?

3.【spy++の画面】
spy++の画面
それぞれ同じレベルのウィンドウとして認識されているように見えます。

###実現したいこと
Adobe Acrobat Reader DCウィンドウのウィンドウハンドルから、パスワード入力ダイアログのウィンドウハンドルを取得したい。

###試したこと
FindWindow()関数で①Adobe Acrobat Reader DCウィンドウのウィンドウハンドルを取得後、
EnumChildWindows()関数で①に紐づいている子ウィンドウを取得した。
###発生している問題

1.取得した①の子ウィンドウの中に②のウィンドウが含まれていない。 →①のウィンドウの子ではないから? ではなぜ②のプロパティでは①が親になっていたのか、、、 2.親子関係がだめなら所有関係で取得できないかと模索しましたが、僕の力では探すことができませんでした、、、どなたか知っている方がいれば宜しくお願い致します。

###該当のソースコード

C#

1 public void Test() 2 { 3 //親ウィンドウを探す 4 IntPtr hWndParent = FindWindow("AcrobatSDIWindow", null); 5 //対象の子ウィンドウを探す 6 IntPtr TargrtPWhWnd = FindTargetHWND(GetWindow(hWndParent), "#32770"); 7 } 8 9 // すべての子孫windowの中から任意のクラス名のhWndを取得する 10 public static IntPtr FindTargetHWND(Window top, string targetClassName) 11 { 12 var all = GetAllChildWindows(top, new List<Window>()); 13 return all.Where(x => x.ClassName == targetClassName).Skip(0).First().hWnd; 14 } 15 // 指定したウィンドウの全ての子孫ウィンドウを取得し、リストに追加する 16 public static List<Window> GetAllChildWindows(Window parent, List<Window> dest) 17 { 18 dest.Add(parent); 19 EnumChildWindows(parent.hWnd).ToList().ForEach(x => GetAllChildWindows(x, dest)); 20 return dest; 21 } 22 23 // 与えた親ウィンドウの直下にある子ウィンドウを列挙する(孫ウィンドウは見つけてくれない) 24 public static IEnumerable<Window> EnumChildWindows(IntPtr hParentWindow) 25 { 26 IntPtr hWnd = IntPtr.Zero; 27 while ((hWnd = FindWindowEx(hParentWindow, hWnd, null, null)) != IntPtr.Zero) { yield return GetWindow(hWnd); } 28 } 29 30 // ウィンドウハンドルを渡すと、ウィンドウテキスト(ラベルなど)、クラス、スタイルを取得してWindowsクラスに格納して返す 31 public static Window GetWindow(IntPtr hWnd) 32 { 3334 }

###補足情報(言語/FW/ツール等のバージョンなど)
OS:windows7
言語:C#
開発環境:Visual Studio 2015
ツール:Adobe Acrobat Reader DC

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

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

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

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

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

guest

回答1

0

ベストアンサー

子Window WS_CHILDWINDOW ではないからだと思います。

そういう時は以下の方法で調べます。

  • EnumWindowsでWindowを列挙してプロセスIDが一致するWindowを調べる
  • GetWindowThreadProcessId でスレッドIDを取得してEnumThreadWindowsでWindowを調べる

(今回はこのパターンも使える)

投稿2018/01/24 13:50

hmmm

総合スコア818

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

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

Lvr642

2018/01/25 02:52

>hmmm様 ご回答ありがとうございます。 •EnumWindowsでWindowを列挙してプロセスIDが一致するWindowを調べる の方法で取得することができました!ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問