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

解決


奈々氏  2005-05-11 21:46:07  No: 89754  IP: [192.*.*.*]

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

編集 削除
奈々氏  2005-05-11 21:49:58  No: 89755  IP: [192.*.*.*]

付け忘れました。
開発環境はWindows XP+VB6です。

編集 削除
K.J.K.  2005-05-12 12:53:25  No: 89756  IP: [192.*.*.*]

それは、"Active Desktop"が作成するウィンドウクラス名ですよね。
API関数のGetWindowTextLength及びGetWindowTextを使ってみました
か? 特別なことをしない限り、SendMessageで出来るのは同プロセス
内に限りますよね?

編集 削除
奈々氏  2005-05-12 23:22:17  No: 89757  IP: [192.*.*.*]

逆のようですが、
GetWindowTextでは他プロセスの文字は取得できず、
SendMessageは他プロセスでも取得できるようなのですが・・・
GetWindowTextも結局はWM_GETTEXTを送っているだけのようです。

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

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

編集 削除
魔界の仮面弁士  2005-05-13 06:06:14  No: 89758  IP: [192.*.*.*]

> 現在、IE上でHTMLを表示している「Internet Explorer_Server」という部分から文字列を取得したいと思っています。

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


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

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

編集 削除
K.J.K.  2005-05-13 10:12:29  No: 89759  IP: [192.*.*.*]

# 全うな方法は弁士さんが出してますので、以下無意味文。

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

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

編集 削除
奈々氏  2005-05-13 18:59:02  No: 89760  IP: [192.*.*.*]

K.J.K様、魔界の仮面弁士様、返信ありがとうございます。

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

編集 削除
魔界の仮面弁士  2005-05-13 19:47:48  No: 89761  IP: [192.*.*.*]

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  No: 89762  IP: [192.*.*.*]

魔界の仮面弁士様から頂いたソースを元にUUID型等を付け加えて実行したところ取得することができました。
ありがとうございましたw

編集 削除