ダイアログの詳細について(FindWindow)
- 評価
- クリップ 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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
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”になりました。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
Spy++ でみつけてください。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
ウィンドウを見つける方法はZuishin 様がすでに回答されているので。
とりあえず、「C# 保存先の指定」で検索。
すぐに結果が出てくるのでここには書きません。
検索スキルはプログラミングをする上で必須と言っていいレベルなので、「初心者でも分かるようにしてほしい」ではなく、「初心者だからこそ」時間をかけて色々検索してみましょう。
僕は熟練者というほどではないので、気になるキーワード、分からない処理があった場合はキーワードを変えながら検索結果100ページ分のサイトくらいは目を通します。
程度は人によりますが、そうやって見ることも知識を吸収し、他の作業で役に立つリソースになりますので、初心者の内に癖を付けていくのがいいと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.20%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
y_waiwai
2018/09/03 14:53
なにをやろうとしてるんでしょうか。説明が省略されすぎて意味不明です
退会済みユーザー
2018/09/03 15:18
FindWindowを利用してダイアログの操作をしたいです。上記写真は何で指定すればいいのでしょうか。
y_waiwai
2018/09/03 15:23
どういう状況の画面でしょうか。FindWindowsといっても、どこにある関数なのか不明です。質問自体を編集して、そこらへんの説明を加えてください
退会済みユーザー
2018/09/03 22:15
情報更新しました。この内容でも足りないでしょうか。
退会済みユーザー
2018/09/04 10:09
現在は[名前を付けて保存]画面の操作をしたいのですが、 初期はファイル名:にカーソルがあるので本日の日付をSendkeyで送信するように記載しましたが入力できませんでした。 ダイレクトに保存先パスやファイル名を入力する方法をご存知でしたらご教授お願いいたします。
Zuishin
2018/09/04 17:02 編集
おおもとになる hWnd3 が 0 ですね。クラス名を指定してやってみてください。それでも失敗するなら FindWindow の定義に失敗しているかもしれませんので、その部分を追記してください。
退会済みユーザー
2018/09/04 17:28
修正後のソースコードと宣言文も追記いたしました。ウインドウクラスも指定しましたが、変わらず動作しない状況です。どこか誤っている箇所等ございましたらご教授お願いいたします。
Zuishin
2018/09/05 11:56
間違ってないように見えますね。うーん……
yukihisa
2018/09/05 14:21
その前段階のダウンロード用ダイアログは操作できてますから、取れるように見えますね。代入と宣言を別にしてみる。。。とか?