質問: ### 前提・実現したいこと 他アプリケーションが出力したダイアログ ボックスにENTERコマンドを送信したい。 他アプリケーションのハンドルを取得に成功しましたが、そのアプリケーションが管轄する ダイアログ ボックスのハンドルを取得できないためENTERコマンドが送信できません。 できれば他アプリケーションのハンドルを引数に入れると内部で管理しているハンドル等をlistに入れるような関数があればほしいです。 ### 試したこと http://tech.sanwasystem.com/entry/2015/11/25/171004 上記のURLを参考にプログラムを作りましたが、 ダイアログボックスのハンドルが取得できません。 https://dobon.net/vb/dotnet/process/enumwindows.html 上記のURLのWin32 APIのEnumWindowsを使用する方法ではダイアログ ボックスのハンドルを取得できました。 しかし、何をやっているのかさっぱりわかりません。 ### 補足情報(言語/FW/ツール等のバージョンなど) visual studio 2013 C#
回答: Windowsアプリでは、親のウィンドウの下に子ウィンドウが配置されるものです。 同じ親に複数の子ウィンドウが配置される場合にはそれらの子ウィンドウは兄弟ウィンドウといったイメージとなります。 この辺りの詳細な説明もご提示いただいた最初のURLに記載されているかと思います。 これらの構造を利用して、所望のイベントを送付するボタンを探すことが最初のステップとなります。 ダイヤログボックスにフォーカスが当たっている状態でEnterキーを押下するとデフォルトボタンが反応するということかと思いますので、親のダイヤログボックスのウィンドウハンドルを利用してイベントを送付するか、デフォルトボタンを探してそのウィンドウハンドルを利用するかの2つの方法があるかと思います。 *ちなみに私自身前者は試してみないとうまく動作するかわかりません。 上記を踏まえて、まずは所望のウィンドウハンドルを取得するのですが、それも最初のURLに記載があります。以下の部分で、calcが操作するアプリの名称です。 ``` // 電卓のトップウィンドウのウィンドウハンドル(※見つかることを前提としている) var mainWindowHandle = Process.GetProcessesByName("calc")[0].MainWindowHandle; ``` 「他アプリケーションのハンドルを取得に成功」とおっしゃっているので、Process.Get...の部分をそのハンドルに置き換えればよろしいかと思います。 そこから、所望のウィンドウハンドルを取得するには、ウィンドウが保有する情報(タイトル名、クラス名:ボタンやウィンドウなど)を元に一意に絞り込む必要があります。 このために、Spyというツール(https://msdn.microsoft.com/ja-jp/library/dd460756.aspx)を利用して対象のアプリケーションが保有するウィンドウを調べることになります。