IEに表示されている文字列を取得するには?

[戻る]
奈々氏 2005/05/11(水) 21:46:07
現在、IE上でHTMLを表示している「Internet Explorer_Server」という部分から文字列を取得したいと思っています。 
この「Internet Explorer_Server」は、Yahoo! メッセンジャー等でも使用されているものなのですが、WebBrowserコントロールとは異なるようです。(WebBrowserコントロールのクラス名はShell Embeddingでした。 
SendMessageでWM_GETTEXTを送っても取得はできず、大変困っています。 
どなたかご教授をお願いします。 

スポンサーリンク

奈々氏 2005/05/11(水) 21:49:58
付け忘れました。 
開発環境はWindows XP+VB6です。 

K.J.K. [E-Mail] 2005/05/12(木) 12:53:25
それは、"Active Desktop"が作成するウィンドウクラス名ですよね。 
API関数のGetWindowTextLength及びGetWindowTextを使ってみました 
か? 特別なことをしない限り、SendMessageで出来るのは同プロセス 
内に限りますよね? 

奈々氏 2005/05/12(木) 23:22:17
逆のようですが、 
GetWindowTextでは他プロセスの文字は取得できず、 
SendMessageは他プロセスでも取得できるようなのですが・・・ 
GetWindowTextも結局はWM_GETTEXTを送っているだけのようです。 

http://homepage2.nifty.com/DSS/VCPP/API/GetWindowTextAndEdit.htm 

それとCreatObjectを利用して文字を取得する方法があるのですが、これはVBからIEのオブジェクトを作成するようなので残念ながら使えませんでした。 
SendMessageで送る定数さえ分かれば取得が可能のような気がします。 

魔界の仮面弁士 2005/05/13(金) 06:06:14
> 現在、IE上でHTMLを表示している「Internet Explorer_Server」という部分から文字列を取得したいと思っています。 

AccessibleObjectFromWindow API から、IAccessibleインターフェイス経由で 
取り出すとか。あるいは、MSHTML経由で取り出す事もできますよね。 


> これはVBからIEのオブジェクトを作成するようなので残念ながら使えませんでした。 
ShellWindowsコレクションを使えば、起動済みのInternetExplorerオブジェクトを 
列挙することができます。 

あるいは、今回はウィンドウハンドルまで取得出来ているようですから、 
WM_HTML_GETOBJECT を使って、直接 IHTMLDocument2 を得るという手法でも 
良いかも知れません。この場合は、IEのバージョン情報画面などで 
使われているHTMLの内容なども取得できますね。 

K.J.K. [E-Mail] 2005/05/13(金) 10:12:29
# 全うな方法は弁士さんが出してますので、以下無意味文。 

GetWindowTextは、確かにWM_GETTEXTを送っていますが、問題は 
そちらではなく、プロセスを跨ぐメモリ空間に関する扱いです。 
トップレベルウィンドウであるのならば、GetWindowTextなどを 
用いてウィンドウタイトルが取得できます。が、子ウィンドウに 
関して行うのであれば、そちらのプロセスでも認識できるような 
メモリ領域を確保し、引数として渡してあげる必要がありますよね。 
但し、User32.dllが管理している一部のクラスでは、その辺りを 
自動的に認識してくれるのもあります。 
SendMessageの第4引数に参照型のパラメータを設定する必要の 
あるメッセージでは、どれでも考えるべきことですよね。 

# ところで、HTMLテキストそのものはWM_GETTEXTでの取得対象に 
# なっているの? 

奈々氏 2005/05/13(金) 18:59:02
K.J.K様、魔界の仮面弁士様、返信ありがとうございます。 

最終的にメッセンジャーからも文字を取得したいので、 
WM_HTML_GETOBJECTを利用する方法が適格かと思い検索したのですが、 
C++での利用方法等しかヒットせず、取得方法が分かりませんでした。 
よろしければWM_HTML_GETOBJECTについて説明していただけると幸いです。 

魔界の仮面弁士 2005/05/13(金) 19:47:48
VB.NET, VB6, Delphiのサンプルも公開されてたと思いますけど。 


> よろしければWM_HTML_GETOBJECTについて説明していただけると幸いです。 

説明するほどの余裕は無いので……サンプルだけ。 

Private Function WindowDOM(ByVal hWnd As Long) As Object ' IHTMLDocument 
  Dim typUUID As UUID, lngRes As Long, lngMsg As Long 
  lngMsg = RegisterWindowMessage("WM_HTML_GETOBJECT") 
  If lngMsg <> 0 Then 
    Call SendMessageTimeout(hWnd, lngMsg, 0, 0, SMTO_ABORTIFHUNG, 1000, lngRes) 
    If lngRes <> 0 Then 
      With typUUID 
        .Data1 = &H626FC520 
        .Data2 = &HA41E 
        .Data3 = &H11CF 
        .Data4(0) = &HA7 
        .Data4(1) = &H31 
        .Data4(2) = &H0 
        .Data4(3) = &HA0 
        .Data4(4) = &HC9 
        .Data4(5) = &H8 
        .Data4(6) = &H26 
        .Data4(7) = &H37 
      End With 
      Call ObjectFromLresult(lngRes, typUUID, 0, WindowDOM) 
    End If 
  End If 
End Function 

奈々氏 2005/05/13(金) 20:42:41
[[解決]]
魔界の仮面弁士様から頂いたソースを元にUUID型等を付け加えて実行したところ取得することができました。 
ありがとうございましたw 

スポンサーリンク

追加発言(4ヶ月以上古い記事に書き込めません。)
■ お名前(ペンネーム可)
  
■ メールアドレス(省略可、半角で入力)
  
■ ホームページアドレス(省略可、半角で入力)
  
■ 発言(エラー時再送信禁止)
  ←解決時は質問者本人がここをチェックしてください。
  
■ 書き込み認証キーを入力して下さい(下記のキーを指定して下さい)
  認証キー :   
  認証キー(確認入力用) :   
■ あなたのランクを選択して下さい(省略可)
   なし   初心者    中級者    上級者    常連    IP表示

  

Programming Library