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

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

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

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

Q&A

解決済

3回答

2391閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

1グッド

1クリップ

投稿2018/09/03 05:43

編集2018/09/19 05:02

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

C#

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

その後、下記のファイル名や保存先等を入力したいのですが、つまずいています。
イメージ説明
何かここを操作する方法はありませんでしょうか。

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

C#

1IntPtr hWnd3 = FindWindow(null, "名前を付けて保存"); 2string filepath = @"c:\test\test.txt"; // 保存先 3 const uint WM_SETTEXT = 0x000c; 4 const uint WM_LBUTTONDOWN = 0x0201; 5 const uint WM_LBUTTONUP = 0x0202; 6 IntPtr hChild; 7 IntPtr hEdit; 8 hChild = FindWindowEx(hWnd3, IntPtr.Zero, "DUIViewWndClassName", null); 9 hChild = FindWindowEx(hChild, IntPtr.Zero, "DirectUIHWND", null); 10 hChild = FindWindowEx(hChild, IntPtr.Zero, "FloatNotifySink", null); 11 hChild = FindWindowEx(hChild, IntPtr.Zero, "ComboBox", null); 12 hEdit = FindWindowEx(hChild, IntPtr.Zero, "Edit", null); 13 // ファイル名を設定する 14 SendMessage(hChild, WM_SETTEXT, IntPtr.Zero, filepath); 15 System.Threading.Thread.Sleep(500); 16 // Saveボタンを見つける 17 hChild = IntPtr.Zero; 18 hChild = FindWindowEx(hWnd3, IntPtr.Zero, "Button", "保存(&S)"); 19 // Saveボタンを押す 20 PostMessage(hChild, WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero); 21 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);

C#

1IntPtr hWnd3 = FindWindow("#32770", "名前を付けて保存"); 2string filepath = @"c:\test\test.txt"; // 保存先 3 const uint WM_SETTEXT = 0x000c; 4 const uint WM_LBUTTONDOWN = 0x0201; 5 const uint WM_LBUTTONUP = 0x0202; 6 IntPtr hChild; 7 IntPtr hEdit; 8 hChild = FindWindowEx(hWnd3, IntPtr.Zero, "DUIViewWndClassName", null); 9 hChild = FindWindowEx(hChild, IntPtr.Zero, "DirectUIHWND", null); 10 hChild = FindWindowEx(hChild, IntPtr.Zero, "FloatNotifySink", null); 11 hChild = FindWindowEx(hChild, IntPtr.Zero, "ComboBox", null); 12 hEdit = FindWindowEx(hChild, IntPtr.Zero, "Edit", null); 13 // ファイル名を設定する 14 SendMessage(hEdit, WM_SETTEXT, IntPtr.Zero, filepath); 15 System.Threading.Thread.Sleep(500); 16 // Saveボタンを見つける 17 hChild = IntPtr.Zero; 18 hChild = FindWindowEx(hWnd3, IntPtr.Zero, "Button", "保存(&S)"); 19 // Saveボタンを押す 20 PostMessage(hChild, WM_LBUTTONDOWN, IntPtr.Zero, IntPtr.Zero); 21 PostMessage(hChild, WM_LBUTTONUP, IntPtr.Zero, IntPtr.Zero);
退会済みユーザー👍を押しています

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

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

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

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

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

y_waiwai

2018/09/03 05:53

なにをやろうとしてるんでしょうか。説明が省略されすぎて意味不明です
退会済みユーザー

退会済みユーザー

2018/09/03 06:18

FindWindowを利用してダイアログの操作をしたいです。上記写真は何で指定すればいいのでしょうか。
y_waiwai

2018/09/03 06:23

どういう状況の画面でしょうか。FindWindowsといっても、どこにある関数なのか不明です。質問自体を編集して、そこらへんの説明を加えてください
退会済みユーザー

退会済みユーザー

2018/09/03 13:15

情報更新しました。この内容でも足りないでしょうか。
退会済みユーザー

退会済みユーザー

2018/09/04 01:09

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

2018/09/04 08:02 編集

おおもとになる hWnd3 が 0 ですね。クラス名を指定してやってみてください。それでも失敗するなら FindWindow の定義に失敗しているかもしれませんので、その部分を追記してください。
退会済みユーザー

退会済みユーザー

2018/09/04 08:28

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

2018/09/05 02:56

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

2018/09/05 05:21

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

回答3

0

ベストアンサー

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

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

追記

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

C#

1 class Program 2 { 3 [DllImport("user32.dll")] 4 static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 5 6 [DllImport("user32.dll")] 7 static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfeter, string lpszClass, string lpszWindow); 8 9 [DllImport("user32.dll")] 10 static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, String lParam); 11 12 13 static void Main(string[] args) 14 { 15 IntPtr hWnd3 = FindWindow("#32770", "名前を付けて保存"); 16 string filepath = @"c:\test\test.txt"; // 保存先 17 const uint WM_SETTEXT = 0x000c; 18 IntPtr hChild; 19 IntPtr hEdit; 20 21 hChild = FindWindowEx(hWnd3, IntPtr.Zero, "DUIViewWndClassName", null); 22 hChild = FindWindowEx(hChild, IntPtr.Zero, "DirectUIHWND", null); 23 hChild = FindWindowEx(hChild, IntPtr.Zero, "FloatNotifySink", null); 24 hChild = FindWindowEx(hChild, IntPtr.Zero, "ComboBox", null); 25 26 hEdit = FindWindowEx(hChild, IntPtr.Zero, "Edit", null); 27 // ファイル名を設定する 28 SendMessage(hEdit, WM_SETTEXT, IntPtr.Zero, filepath); 29 30 } 31 }

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

投稿2018/09/04 01:20

編集2018/09/05 00:36
YAmaGNZ

総合スコア10240

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

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

退会済みユーザー

退会済みユーザー

2018/09/04 06:37

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

2018/09/04 06:45

WM_SETTEXTを送るのはhEditに対してでは?
退会済みユーザー

退会済みユーザー

2018/09/04 06:50

YAmaGNZ様 SendMessage(hEdit, WM_SETTEXT, IntPtr.Zero, filepath); 上記に変更しましたが、変わらず入力出来ていない状況です。 上記の様に変更するということで間違っていませんでしょうか。
YAmaGNZ

2018/09/04 07:47

ウインドウハンドルが正常に取得できているか確認してみてください。 正常に取得できていれば、spy++のウインドウハンドルと同じ値となっているはずです。 取得したハンドルが0の場合、FindWindow、FindWindowEXの定義、引数が違う可能性があります。
退会済みユーザー

退会済みユーザー

2018/09/04 07:56

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

2018/09/04 08:21

最初の「ファイルのダウンロード」のダイアログのボタンをクリックする処理と「名前を付けて保存」のダイアログのウインドウハンドルを取得する部分はどれくらいの時間で処理されているのでしょうか? もしかしたら、ボタンをクリックしてから「名前を付けて保存」のダイアログが出る前にその処理が実行されていたりしませんか? ボタンをクリックする処理の後にsleepを入れたらどうなるでしょうか?
退会済みユーザー

退会済みユーザー

2018/09/05 00:07

Sleepをいれ、時間も短くや長く変更してみましたが、値等も取得できず変更も出来ませんでした。 その他考えられる点等ございますでしょうか。
YAmaGNZ

2018/09/05 00:28

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

退会済みユーザー

2018/09/05 02:59

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

2018/09/05 05:02

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

0

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

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

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

投稿2018/09/04 01:23

編集2018/09/04 01:25
yukihisa

総合スコア672

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

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

退会済みユーザー

退会済みユーザー

2018/09/04 06:37

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

2018/09/04 06:58

最後見つけたテキストボックスは'hEdit'になってるけど、'hChild'に送信してません? あと、最後のパラメータはStringじゃなくてStringBuilderで記述されているサイトしか見つかりません。
退会済みユーザー

退会済みユーザー

2018/09/04 07:06

yukihisa様 hEditに変更しました。しかし、現在も動作出来ていない状況です。 最後のパラメータの件については下記を参考にしましたが、記述方法が間違っているでしょうか。 http://d.hatena.ne.jp/feb-hare/?of=144
yukihisa

2018/09/04 07:17 編集

ファイル保存ダイアログは++spyの画面にて#32770番になっていますが、参考にしているサイトでも#32770を指定しているのでnullじゃだめな気がします。
退会済みユーザー

退会済みユーザー

2018/09/04 07:22

yukihisa様 string filepath = @"c:\test\test.txt"; // 保存先 この後に System.Threading.Thread.Sleep(500); を追加しましたが、状況は変わらずでした。
退会済みユーザー

退会済みユーザー

2018/09/04 07:26

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

2018/09/04 07:52

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

退会済みユーザー

2018/09/04 07:56

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

0

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

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

投稿2018/09/03 06:48

Zuishin

総合スコア28660

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

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

退会済みユーザー

退会済みユーザー

2018/09/03 13:15

初心者でも分かるようにしていただけると嬉しいです… Spy++ でどう検索すると解決するのでしょうか。 お手数ですが、返答よろしくお願い致します。
Zuishin

2018/09/03 14:06

まずインストール方法にリンクを張りましたのでそれを見てインストールしてください。
Zuishin

2018/09/03 14:36

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

退会済みユーザー

2018/09/04 01:09

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

退会済みユーザー

2018/09/04 06:38

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問