tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルIEのアドレスバーにSendMessage
記事No15532
投稿日: 2012/07/10(Tue) 17:31
投稿者Boze
環境:VB6.08 WindowsXP SP3

いつも大変お世話になっております。
標題についてうまくいかないのでご教示お願いいたします。

既に開いているIE(Process取得済み)に対してURLを送信しようとしています。
SendKeysではうまく動作しないためより確実であろうSendMessageの使用を検討しています。

@ VBよりShellでIEを開く。2重軌道禁止のためにProcessを取得しておく
A 別のURLを開くときにProcessが生きていれば既存のIEにURL送信
  Processが死んでいればShellにて起動

今しようとしていることは
@ ProcessよりIEのウィンドウハンドルを取得
A FindoWindowExよりアドレスバーのハンドルを取得
B SendMessageによりアドレスバーにSetFocus
C SendMessageによりアドレスバーにURL送信

しかし現在Aでつまずいて困っています。

いくつかのサイトによると、
IEの親ハンドル  :hWnd
そのChildハンドル:hWndC1 WorkerW
そのChildハンドル:hWndC2 ReBarWindow32
そのChildハンドル:hWndC3 EDIT ←これがAddressBar
となっており

hWndC1=FindWindowEx(hWnd,0,"WorkerW",vbnullstring)
hWndC2=FindWindowEx(hWnd,0,"ReBarWindow32",vbnullstring)
hWndC3=FindWindowEx(hWnd,0,"EDIT",vbnullstring)

SendMessage(hWndC3,WM_SETFOCUS,0,0)
SendMessage(hWndC3,WM_SETTEXT,0,URL)
PostMessage(hWndC3,WM_KEYDOWN,VK_RETURN,0)

でできるはずなのですが、hWndC1が取得できず先に進めません。
今だ検索中ですが正しい方法を教えていただけるとありがたいです。
宜しくお願いします

[ツリー表示へ]
タイトルRe: IEのアドレスバーにSendMessage
記事No15533
投稿日: 2012/07/10(Tue) 19:22
投稿者魔界の仮面弁士
> 環境:VB6.08 WindowsXP SP3
ひとつ確認させてください。

私は「VB6.08」というバージョンの VB に心当たりがなく、
google 等で検索しても、6.08 という製品バージョンが
見当たらなかったのですが、それはどのような製品ですか?


> 既に開いているIE(Process取得済み)に対してURLを送信しようとしています。
単純に、Navigate メソッドを呼び出すだけでは駄目でしょうか。
自分で起動したものではなく、すでに起動されているものを拾うなら、
ROT から得るか、もしくは ShellWindows コレクションで列挙できるはずです。

Dim IE As Object, S As String
For Each IE In GetObject("new:9BA05972-F6A8-11CF-A442-00A0C90A8F39")
    If TypeName(IE.Document) = "HTMLDocument" Then
        S = "Top = " & CStr(IE.Top) & vbCrLf _
          & "Left = " & CStr(IE.Left) & vbCrLf _
          & "Width = " & CStr(IE.Width) & vbCrLf _
          & "Height = " & CStr(IE.Height) & vbCrLf _
          & "URL = " & IE.LocationURL

        If MsgBox("googleに移動しますか?" & vbCrLf & S, vbYesNo Or vbQuestion) = vbYes Then
            IE.Navigate "http://www.google.com/"
            Exit For
        End If
    End If
Next


> SendMessage(hWndC3,WM_SETFOCUS,0,0)
VB6 であれば、
 SendMessage hWndC3, WM_SETFOCUS, 0, 0
 Call SendMessage(hWndC3, WM_SETFOCUS, 0, 0)
 ret = SendMessage(hWndC3, WM_SETFOCUS, 0, 0)
でのいずれかの構文になるはずです。

もし、上記のいずれでもなく、本当に
 SendMessage(hWndC3, WM_SETFOCUS, 0, 0)
という構文で呼び出されておられるのだとすれば、それは VB6 ではありませんので、
お隣の VB.NET 掲示板への移動をお願いします。

[ツリー表示へ]
タイトルRe^2: IEのアドレスバーにSendMessage
記事No15534
投稿日: 2012/07/11(Wed) 00:57
投稿者boze
> それはどのような製品ですか?
僕の見るところがおかしいのでしょうか?
VB6.0 EnterpriseEditionです

> ROT から得るか、もしくは ShellWindows コレクションで列挙できるはずです。
ShellWindowsコレクションで列挙した後どうやってURLを設定するかわからず、ググったら
前述が出てきたので使ってみたしだいです。

LocalURLに値を代入するとかRunコマンド等を試しましたがErrorが出たので使用できないと
あきらめました。

> VB6 であれば・・・になるはずです。
申し訳ありません。VB.NetがCallなしで書けることを知りませんでしたので省略してしまいま
した。私としては端的に箇条書きしたつもりでした。

今回の場合、どうやってググれば答えにたどり着けたのでしょうか?
ShellWindowsコレクションで開いているURLを取得まではたどり着けましたが、逆にURLを送
るとなるとSendKeysかSendMessageしか出てきませんでした。
参考になるサイトや書籍がありましたら教えていただけるとありがたいです。

[ツリー表示へ]
タイトルRe^3: IEのアドレスバーにSendMessage
記事No15535
投稿日: 2012/07/13(Fri) 09:47
投稿者魔界の仮面弁士
> 投稿者 : boze
boze さんは、Boze さんと同じ方なのですよね?


>>> 環境:VB6.08 WindowsXP SP3
>> それはどのような製品ですか?
> 僕の見るところがおかしいのでしょうか?
具体的には、どの部分を見ておられますか?

メモ帳の話のときにも書きましたが(No.15518)、私は
「VB6.08」というバージョンを見たことがなく、google 等で
検索しても、Bozeさんの投稿しか見当たりませんでした。

".08" という部分は、どこに記載されていたものなのか、
後学のために教えていただけないでしょうか。よろしくお願いします。


> ShellWindowsコレクションで列挙した後どうやってURLを設定するかわからず、
Navigate メソッドもしくは Navigate2 メソッドを利用してみてください。


> 今回の場合、どうやってググれば答えにたどり着けたのでしょうか?
操作対象が IE なので、まず調査すべき内容としては
InternetExplorer オブジェクトの仕様に関してかと思います。

http://msdn.microsoft.com/en-us/library/aa752084%28VS.85%29.aspx

公式資料(米語)が上記にありますが、利用者が比較的多い有名なオブジェクトであり、
日本語で解説された資料も多数存在します。VB6の他、VBScript や VBA 等からも
良く利用されておりますので、『InternetExplorer オブジェクト』というキーワードで
再度調査してみてください。下記なども参考になるかと思います。
http://www.ken3.org/cgi-bin/group/vba_ie.asp


で、IE そのものを起動する場合には、
 Dim IE As Obejct
 Set IE = CreateObject("InternetExplorer.Application")
 IE.Visible = True
のようにします。“Microsoft Internet Controls”を参照設定している場合には、
 Dim IE As InternetExplorer
 Set IE = New InternetExplorer
 IE.Visible = True
のように書くこともできます。参照設定時は IntelliSense による
入力補完が働くので、プロパティやメソッドを探すのも楽でしょう。

そのメンバーを一つ一つ見ていけば、"URL" という名前の引数をとる物が
2 つ見つかるかと思いますが、それが、 Navigate / Navigate2 メソッドです。

 IE.Navigate "http://hanatyan.sakura.ne.jp/"


IE を起動したらば、当然、URL の指定も必要になりますから、google 等で
見つかるサンプルの多くも、このメソッドを使っているかと思います。


そして、新規に IE を起動するのではなく、既に起動済みの IE を
列挙する場合に使うのが ShellWindows コレクションとなりますが、
こちらは既に御存知なのですよね。



> LocalURLに値を代入するとか
LocationURL プロパティの事でしょうか? (LocalURL というプロパティは見たことがありません)

参照設定時にオブジェクト ブラウザ(開発環境でF2キー)を表示させてみると、
| Property LocationURL As String
|     読み取り専用
|     SHDocVw.InternetExplorer のメンバー
|     Gets the full URL/path currently viewed.
などと書かれていますので、これは URL を指定するためのものだと分かりますね。


> Runコマンド等を試しましたがErrorが出たので使用できないと
「Run コマンド」(≠Run メソッド、Run プロパティ、Run ステートメント)とありますが、
この Run というコマンド名は、どこから思いついた(or どこに書かれていた)キーワードでしょうか?

IE で[コマンド]といえば、ExecWB メソッドや Document.ExecCommand メソッドが
思い浮かびますが、"Run" というコマンドは無かったように思います。

VB6 自体にも Run プロパティ/Run メソッド/Run ステートメント/Run 関数は存在しませんし
(Access VBA には Application.Run メソッドがありますが)、また、今回操作対象となる
InternetExplorer 自体にも Run と名のつくメンバーは用意されていないはずです。


> ShellWindowsコレクションで開いているURLを取得まではたどり着けましたが、
> 逆にURLを送るとなるとSendKeysかSendMessageしか出てきませんでした。
なるほど、そうでしたか。たどり着けなかったにしても、どのように調査したのかという
具体的な情報があると状況が把握しやすいので、回答する側としても助かります。

[ツリー表示へ]