解説Tweet色々なシーンで見かける以下の様な「ファイル選択ダイアログ」ですが、これを自動操作できれば便利だと思いませんか?今回はこのダイアログを自動操作して、指定したファイルを選択させる処理を紹介致します。最後にウィンドウとウィンドウハンドルについてダイアログの操作にあたって、まずは「ウィンドウ」というものが何かを理解する必要があります。Windows上で動作している様々なアプリケーションは「ウィンドウ」と「コントロール」の組み合わせで構成されています。Microsoftでは以下の様に紹介されています。さまざまな形式のウィンドウが表示されます。実際、画面に表示されているかどうかにかかわらず、ほとんどの要素はウィンドウ内に存在します。つのウィンドウ形式です。バーなど、フォーム上にあるコントロールもウィンドウである場合があります。デスクトップに表示されるアイコン、およびデスクトップ自体もウィンドウです。今回操作するダイアログも、もちろん「ウィンドウ」と「コントロール」で構成されています。Windows上でこれら「ウィンドウ」と「コントロール」はどの様に管理されているでしょうか。実は全ての項目には整数の”識別番号”が割り振られており、その番号によって管理されているのです。この識別番号は”ハンドル”と呼ばれます。ウィンドウやコントロールも大まかに色を付けているだけで、実際はもっと細かく分かれています。この様に複数のウィンドウとコントロールで構成されており、それぞれハンドルの値は異なります。上図においてファイル名の設定に関する操作を行いたい場合は、「78845678」というハンドルを使用することになります。(※ファイル名の入力ボックスに割り当てられているハンドル値)スポンサーリンクダイアログのハンドルを取得するとりあえずは「ダイアログを操作するにはハンドルの値が必要」ということを覚えてもらえれば良いです。これから実際にハンドルの値を取得してみましょう。「え?わざわざ取得しなくてもさっき”78845678”って言ってたじゃん。これを使えばいいんでしょ?」と思うかもしれませんが、ハンドルの値というのは固定で割り振られている訳ではありません。ウィンドウが作られた段階でハンドルが割り当てられますが、ウィンドウが閉じられるとそのハンドルは解放されます。再度ウィンドウが作成された場合はまた新たなハンドル値が割り振られますので、最初と同じハンドルが割り当てられるとは限らないのです。ハンドルを取得するには「FindWindow」と呼ばれる関数を使用します。ウィンドウ名);・クラス名は「#32770」を指定します。この値はダイアログのクラス名となり、基本的にこの名前は固定です。・ウィンドウ名は「アップロードするファイルの選択」を指定します。この部分がウィンドウ名です。これらをあわせて以下の様に記述します。"アップロードするファイルの選択")※使用する場合はAPI宣言が必要になります。PtrSafe”等の記述が必要になります。上記のコードを実行することで取得できた値が、そのファイル選択ダイアログのハンドルです。コントロールのハンドルを取得するファイルを選択して決定させるためには、”ファイル名入力ボックス”と”開くボタン”を操作する必要があります。こちらのコントロールについてもハンドルを取得しましょう。ハンドルを取得するには「FindWindowEx」関数を使用します。ウィンドウ名);・親ウィンドウのハンドルは先ほど取得したダイアログのハンドルを指定します。・子ウィンドウのハンドルは無し。・入力ボックスのクラス名は「Edit」。・ボタンのクラス名は「Button」。ウィンドウ名は「開く(&O)」となります。今回クラス名の調べ方については省きます。最初は「FindWindow」という関数を使い、今度は「FindWindowEx」という関数が出てきました。用途の違いは以下の通りです。今回は親となるダイアログに含まれるコントロール要素を取得するため、FindWindowExを使用するという訳です。それでは上記の内容をもとに以下の様に記述します。"開く(&O)")実はファイル名入力ボックスについては幾つかのコントロールの入れ子になっているので、「ダイアログ」の中にある「ComboBoxEx32」の、更に中にある「ComboBox」の・・・といった様に順番に掘り下げていく必要があります。先ほどのダイアログのハンドルを取得する処理と組み合わせると、”入力ボックス”、”ボタン”のハンドルもそれぞれ取得できることを確認できるはずです。ブレークポイントなど設定して、値が取得できていることを確認してみましょう。スポンサーリンクメッセージを送信するではこれで必要なデータ(ハンドル)は全て揃いました。後はダイアログに対して情報(ファイル名など)を送信するだけですね。情報の送信には「SendMessage」関数を使用します。番目のパラメータ);・送信先ウィンドウのハンドルは先ほど取得したハンドルを指定します。入力ボックスは”hInputBox”、ボタンは”hButton”の値を指定します。・Msgには実行したいアクションを指定します。・wParam、lParamは文字通りパラメータの指定です。送信したいファイルパスなどをこちらに指定します。それでは上記の内容をもとに以下の様に記述します。'ボタンをクリックするこのコードをハンドルを取得する処理と組み合わせて実行すると、『Cドライブ直下にある「test.jpg」というファイルを選択して、開くボタンを押す』という処理が行われます。実際にファイルを置いて動作を確認してみましょう。一つ一つの動作を確認するためにも、ステップインで一行ずつ処理させながら変数の中身を見ていくと分かりやすいと思います。ところで、「SendMessage()」というたった1つの関数で文字列を貼り付けたりクリックしたりといった操作ができるのは不思議だと思いませんか?SendMessageにどの様な動きをさせるかというのは、2つ目のMsg引数次第なんです。「&HC」とすれば文字列送信。「&H6」でアクティブ化。「&HF5」でクリック。他にも色々な操作が可能です。興味のある方はぜひ調べてみて下さい。今回はクラス名固定のダイアログなので簡単に操作できましたが、応用すれば更に複雑なものも操作可能です。Outlookなどのソフトであったり、普段会社で使用している業務システムであったり・・・。最後にいかがでしたでしょうか。処理は思うように動きましたか?「一行ずつ処理させた場合はうまくいくけど、通しで実行するとうまくいかない」という場合は、処理の間にSleepを入れてみるなどして処理に余裕を持たせてみましょう。Sleepだと確実性に欠けるという場合は、DoLoopと組み合わせて「ハンドルの値が取れるまでループさせる」といった処理を加えるとより安定すると思います。今回使用した”SendMessage”は、ダイアログ操作以外にも色々なことに使用することができます。今度はまた別の用途で紹介してみますね。「AmazonAPIを使った何かを作ってみる」その3です。自作のツールを公開すると後々何らかのメッセージを表示させたり、最悪動かせない様に止めたいなーと思う事が多々あると思います。最新のツールについて、以下の記事を公開しました。今...記事を読むSeleniumで次の実行時にもサイトのログイン状態を維持したい場合Selenium記事第2弾です。※途中出てくるコードはVBです。現在Seleniumを使ってChromeを操...記事を読むC#でクリックポストの自動登録ツールを作ってみた扱えるプログラミング言語を増やさないとなーという事で、C#の勉強がてら適当に作ってみたツールを公開してみる事にします。ツールの内容は「ク...記事を読むエクセルを使った簡単なバーコード式在庫管理システムを作る商品販売をしている方で、在庫管理にエクセルを利用している方って結構多いと思います。PhotoShop(フォトショップ)を使えば簡単に実現出来...記事を読む仮想通貨の用途について(BTC、MONA、CICC)今回も仮想通貨のお話です。言っても今回は自分用の”まとめ”です。今回で初回のウェブスクレイピングツール編は最後になります。PMいろいろ調べてこちらへたどり着きました。すごく参考になり無事にツールが作れそうです。AM参考になった様で良かったです!他にも分からない処理などがありましたら遠慮無く質問して下さいね!内容次第では記事にして詳しく解説させて頂きます。PMご指摘頂きありがとうございます!修正させて頂きます。PMこの記事は大変わかりやすく、非常に参考になりました。