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

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

ただいまの
回答率

88.20%

ダイアログの詳細について(FindWindow)

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 3,011
退会済みユーザー

退会済みユーザー

下記サイトを参考にダウンロード時のダイアログを操作しようと考えています。
http://note.phyllo.net/?eid=1106262
FindWindowで「ファイルのダウンロード」の記載のあるダイアログがあれば"S"を入力するようにしました。
イメージ説明

IntPtr hWnd2 = FindWindow(null, "ファイルのダウンロード");
if (hWnd2 != null)
  {
   SendKeys.SendWait("s");
  }


その後、下記のファイル名や保存先等を入力したいのですが、つまずいています。
イメージ説明

何かここを操作する方法はありませんでしょうか。

追記 2018/09/04 15:30
回答いただきましたことを参考にSpy++をインストールし、上記を調べました。
イメージ説明
調べた結果を参考に下記コードを作成しましたが、何も動いていません。
System.Threading.Thread.Sleep(500);で時間を長くしたり短くしても何か動かずエラーも出ていません。
何か問題ある点等ありますでしょうか。

IntPtr hWnd3 = FindWindow(null, "名前を付けて保存");
string filepath = @"c:\test\test.txt"; // 保存先
               const uint WM_SETTEXT = 0x000c;
               const uint WM_LBUTTONDOWN = 0x0201;
               const uint WM_LBUTTONUP = 0x0202;
               IntPtr hChild;
               IntPtr hEdit;
               hChild = FindWindowEx(hWnd3, IntPtr.Zero, "DUIViewWndClassName", null);
               hChild = FindWindowEx(hChild, IntPtr.Zero, "DirectUIHWND", null);
               hChild = FindWindowEx(hChild, IntPtr.Zero, "FloatNotifySink", null);
               hChild = FindWindowEx(hChild, IntPtr.Zero, "ComboBox", null);
               hEdit = FindWindowEx(hChild, IntPtr.Zero, "Edit", null);
               // ファイル名を設定する
               SendMessage(hChild, WM_SETTEXT, IntPtr.Zero, filepath);
               System.Threading.Thread.Sleep(500);
               // Saveボタンを見つける
               hChild = IntPtr.Zero;
               hChild = FindWindowEx(hWnd3, IntPtr.Zero, "Button", "保存(&S)");
               // Saveボタンを押す
               PostMessage(hChild, WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero);
               PostMessage(hChild, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);


イメージ説明
上記画像は上記ソースの
// ファイル名を設定する
まで実行した際の値になります。

そもそも取得出来ないのはわかっていますが、どうしてなのかがわからない状況です。

追記 2018/09/04 17:25
取得出来ていない為、現状の状況を記載します。
ウインドウクラス名の指定をして間違っていた点等も修正したソースを記載します。

//宣言文
[DllImport("user32.dll")]
       static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
       [DllImport("user32.dll")]
       static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfeter, string lpszClass, string lpszWindow);
       [DllImport("user32.dll")]
       static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, String lParam);
       [DllImport("user32.dll")]
       static extern bool PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
IntPtr hWnd3 = FindWindow("#32770", "名前を付けて保存");
string filepath = @"c:\test\test.txt"; // 保存先
               const uint WM_SETTEXT = 0x000c;
               const uint WM_LBUTTONDOWN = 0x0201;
               const uint WM_LBUTTONUP = 0x0202;
               IntPtr hChild;
               IntPtr hEdit;
               hChild = FindWindowEx(hWnd3, IntPtr.Zero, "DUIViewWndClassName", null);
               hChild = FindWindowEx(hChild, IntPtr.Zero, "DirectUIHWND", null);
               hChild = FindWindowEx(hChild, IntPtr.Zero, "FloatNotifySink", null);
               hChild = FindWindowEx(hChild, IntPtr.Zero, "ComboBox", null);
               hEdit = FindWindowEx(hChild, IntPtr.Zero, "Edit", null);
               // ファイル名を設定する
               SendMessage(hEdit, WM_SETTEXT, IntPtr.Zero, filepath);
               System.Threading.Thread.Sleep(500);
               // Saveボタンを見つける
               hChild = IntPtr.Zero;
               hChild = FindWindowEx(hWnd3, IntPtr.Zero, "Button", "保存(&S)");
               // Saveボタンを押す
               PostMessage(hChild, WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero);
               PostMessage(hChild, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2018/09/04 17:28

    修正後のソースコードと宣言文も追記いたしました。ウインドウクラスも指定しましたが、変わらず動作しない状況です。どこか誤っている箇所等ございましたらご教授お願いいたします。

    キャンセル

  • Zuishin

    2018/09/05 11:56

    間違ってないように見えますね。うーん……

    キャンセル

  • yukihisa

    2018/09/05 14:21

    その前段階のダウンロード用ダイアログは操作できてますから、取れるように見えますね。代入と宣言を別にしてみる。。。とか?

    キャンセル

回答 3

checkベストアンサー

+1

VBAでファイル選択ダイアログを自動操作する
VBAですが参考になるかと

どのみち、Zuishinさんの仰るとおり、spy++でコントロールなど調べる必要があるかと思います。

 追記

提示されているコードをそのまま使用して、下記を試しました。

    class Program
    {
        [DllImport("user32.dll")]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("user32.dll")]
        static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfeter, string lpszClass, string lpszWindow);

        [DllImport("user32.dll")]
        static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, String lParam);


        static void Main(string[] args)
        {
            IntPtr hWnd3 = FindWindow("#32770", "名前を付けて保存");
            string filepath = @"c:\test\test.txt"; // 保存先
            const uint WM_SETTEXT = 0x000c;
            IntPtr hChild;
            IntPtr hEdit;

            hChild = FindWindowEx(hWnd3, IntPtr.Zero, "DUIViewWndClassName", null);
            hChild = FindWindowEx(hChild, IntPtr.Zero, "DirectUIHWND", null);
            hChild = FindWindowEx(hChild, IntPtr.Zero, "FloatNotifySink", null);
            hChild = FindWindowEx(hChild, IntPtr.Zero, "ComboBox", null);

            hEdit = FindWindowEx(hChild, IntPtr.Zero, "Edit", null);
            // ファイル名を設定する
            SendMessage(hEdit, WM_SETTEXT, IntPtr.Zero, filepath);

        }
    }


このコードを「名前を付けて保存」ダイアログが表示されている状態で実行したところ、ファイル名の部分は”c:\test\test.txt”になりました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/05 09:28

    宣言、FindWindow部分をコピーして「名前を付けて保存」のダイアログが表示されている状態で実行してみましたが、正常にウインドウハンドルが取得できています。
    ですので、宣言、コードのFindWindow部分は問題ないと思います。
    まずは取得コードが正しいか実験の意味で、ステップ実行などで1行づつ動作を確認しながらやってみてはどうでしょう?

    キャンセル

  • 2018/09/05 11:59

    確認ありがとうございます。
    いろいろなサイト等確認しましたが、問題点がわからない状況です。ComboBoxに最初から入力される記述がありますが、そういったことも関係はありますでしょうか。

    キャンセル

  • 2018/09/05 14:02

    ファイルをダウンロードのダイアログのハンドル取得から名前をつけて保存のダイアログの操作までのソースを提示することは出来ますか?
    現在提示されているコードに問題箇所と思われる部分が見つかりませんので、一連の流れで実行した時に何かしらの問題があるのではないかと考えられます。

    キャンセル

0

Spy++ でみつけてください。

インストール方法
Visual Studio > Tool > VS2017: Spy++のインストール

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/03 23:36

    よく見たら質問が全く変わっていますね。端折りすぎというレベルじゃなく本題を完全に省略していましたか。FindWindow について聞く必要もないように見えます。

    キャンセル

  • 2018/09/04 10:09

    省略しすぎてしまい申し訳ありませんでした。
    現在は[名前を付けて保存]画面の操作をしたいのですが、
    初期はファイル名:にカーソルがあるので本日の日付をSendkeyで送信するように記載しましたが入力できませんでした。
    ダイレクトに保存先パスやファイル名を入力する方法をご存知でしたらご教授お願いいたします。

    キャンセル

  • 2018/09/04 15:38

    回答ありがとうございます。
    Spy++をインストールして自分なりに調べてプログラムの作成を行いましたが、追記した箇所でつまずいています。
    何か問題点等ありましたらご指摘お願いできないしょうか。
    よろしくお願いいたします。

    キャンセル

0

ウィンドウを見つける方法はZuishin 様がすでに回答されているので。

とりあえず、「C# 保存先の指定」で検索。
すぐに結果が出てくるのでここには書きません。
検索スキルはプログラミングをする上で必須と言っていいレベルなので、「初心者でも分かるようにしてほしい」ではなく、「初心者だからこそ」時間をかけて色々検索してみましょう。

僕は熟練者というほどではないので、気になるキーワード、分からない処理があった場合はキーワードを変えながら検索結果100ページ分のサイトくらいは目を通します。
程度は人によりますが、そうやって見ることも知識を吸収し、他の作業で役に立つリソースになりますので、初心者の内に癖を付けていくのがいいと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/04 16:26

    IntPtr hWnd3 = FindWindow("#32770", "ファイル名を付けて保存");
    上記に変更しても状況は変わらずでした。

    キャンセル

  • 2018/09/04 16:52

    そこまでやれば大方参考サイトと同じコードになっていると思うので、デバッグモードで起動し、それぞれきちんと見つけられているか、うまく動作しているかを確認してみると原因がある程度予想できるかと思います。

    キャンセル

  • 2018/09/04 16:56

    画像を追加いたしました。
    正常に取得出来ないのはわかっているのですが、おっしゃる通り参考サイトと似た記述になっている為
    どうして取得出来ないのかが原因が自分自身では見つけられていない状況です。
    何か思い当たる点等ありますでしょうか。
    何か必要な情報等あれば追加いたしますので、ご教授よろしくお願いいたします。

    キャンセル

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

  • ただいまの回答率 88.20%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る