- ベストアンサー
C++でブラウザに値をセットする方法
- C++のクライアントプログラムからブラウザのテキストボックスに値をセットする方法を教えてください。
- 具体的には、起動しているプロセスの名前を取得し、該当ブラウザが開いている各タブが指定のURLかどうかをチェックした後、値をセットしてsubmitを実行したいです。
- また、Windowsのバージョンなどによって使う関数やコードが変わることがあるので、その点も教えていただけると助かります。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
1,2は不要。 >最初にヒットした該当ブラウザが開いている各タブが、 >「データを突っ込みたいページのURLかどうかをチェック」 IShellWindows::FindWindowSW method http://msdn.microsoft.com/en-us/library/windows/desktop/cc836568%28v=vs.85%29.aspx VC++でGoogle検索の例を書いてみました。 https://gist.github.com/kumatti1/f39822171f105de439f4
その他の回答 (1)
- chie65536(@chie65535)
- ベストアンサー率44% (8741/19839)
既存のブラウザ(IEなど)を用いて実行したい、と言う場合。 【1】は、以下の関数を用います。 開いているウィンドゥを列挙する http://msdn.microsoft.com/ja-jp/library/cc410851.aspx 【3】~【5】は、以下の関数を用います。 操作したいブラウザにフォーカスを当てる http://msdn.microsoft.com/ja-jp/library/cc411074.aspx フォーカスを当てたウィンドゥにキーストロークを送信する http://msdn.microsoft.com/ja-jp/library/system.windows.forms.sendkeys.send(v=vs.110).aspx 【3】については、IEの場合は 1.「Alt+D」をSendkeysして、アドレスバーにフォーカスを移動 2.「Ctrl+C」をSendkeysしてから、クリップボードから文字列を拾う 3.クリップボードから拾った文字列が目的のURLかどうかチェック 4.URLが違う場合は「Ctrl+Tab」をSendkeysして、1から繰り返す 5.URLが一致した場合は、以下、【4】、【5】の為の処理をする 【4】、【5】については、IEの場合は 1.(フォーカスがアドレスバーにあるものとして)「Tab」を何個かSendkeysして、目的のテキストボックスにフォーカスを移動 2.入力したい文字をSendkeysして、目的のテキストボックスに文字を入力 3.「Tab」を何個かSendkeysして、Submitボタンにフォーカスを移動 4.「スペース」をSendkeysして、Submitボタンを押下させる とゆー事になります。 が、ぶっちゃけて言えば「こんな事は一切しなくて良い」です。 Submitボタンを押した時に実行されるURLが判っているなら http://Submitボタンを押した時に実行されるURL?テキストボックスのname値=入れたい値&Submitボタンのname値=Submitボタンのvalue値 を、ShellExecute関数でopenするだけでオッケーです。 http://msdn.microsoft.com/ja-jp/library/cc422072.aspx 例: ShellExecute( 自分自身のウィンドウのハンドル, "open", "http://www.test.ne.jp/test/cgi/test.cgi?textbox=%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A&Submit=%E9%80%81%E4%BF%A1", NULL, @"C:\tmp", SW_SHOW ); 上記の例では、Submitボタンを押した場合に開かれるページ(formのaction属性の値)は「http://www.test.ne.jp/test/cgi/test.cgi」で、name属性がtextboxになっているテキストボックスに、文字列「あいうえお」を入れ、name属性がSubmit、Value値が「送信」になっているSubmitボタンを押した状態のブラウザをオープンします。 つまり、テキストボックスに「あいうえお」を入れて、「送信」と書かれたボタンを押した時と、まったく同じ事をします。 実行が成功すると、デフォルトのブラウザが起動されて、ボタンを押した後の画面がブラウザに出ます。
お礼
ありがとうございます。 開いているウィンドウの取得方法、 すごく助かりました。 3~5は、今回やりたいことには適しませんでした。 理由は2つです。 ・処理中に他のウィンドウを触られてしまったときに正常動作しない。 ・パラメーターをURLに入れて、値がバレバレになるのは、 セキュリティ的に相応しくない。 しかし、 開いているウィンドウの取得方法、 すごく助かりました。 また、send key についても、 今後、大いに役に立ちそうでありがたいです!
お礼
ありがとうございます! IEオブジェクト用のコレクション IShellWindows で書いて頂いていたため、すごく助かりました! (正確にはまだ勉強しながらなので「凄く助かりそう」ですが。。) VCは Windowsインタフェイスを 基底クラスのIDispatchPtrで取得しているらしいですね。 Windowsインタフェイスの EnvDTE::Windowsのポインタに ダウンキャストしたら、 NULLが返ってきてハマったという話を後から知り、 (Shell.ApplocationからWindows() で取るらしいですが) 変につまづくことがなさそうです。 テキストボックスへのアクセスの仕方も適切で、 また、ちょうどDocument Object Model でやろうとしていたので、 凄く助かりました。