###前提
1.暗号化されたファイルA(PDF)をクリックするとAdobe Acrobat Reader DCウィンドウが開き、その上にパスワード入力ダイアログが表示される。
2.spy++で解析してわかっていること
プロパティ | ① | ② |
---|---|---|
【ウィンドウ名】 | Adobe Acrobat Reader DCウィンドウ | パスワード入力ウィンドウ |
【クラス名】 | AcrobatSDIWindow | #32770 |
【親ウィンドウ】 | なし | Adobe Acrobat Reader DCウィンドウ |
【子ウィンドウ】 | いろいろ(ただし②のパスワード入力ウィンドウは入っておらず) | RICHTEXTEDITERとかokボタン |
→まとめると、②のプロパティで確認すると親子関係になっているが、①を見ると子ウィンドウとして認識していない?
3.【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 { 33 略 34 }
###補足情報(言語/FW/ツール等のバージョンなど)
OS:windows7
言語:C#
開発環境:Visual Studio 2015
ツール:Adobe Acrobat Reader DC
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/25 02:52