ブラウザ(特にタブブラウザ)からURLを取得するには?

解決


choro  2005-04-09 09:13:29  No: 14182

ただいま、起動中のブラウザからURLを取得しようと考えております。
色々探してみましたが、

タブブラウザから開いている全てのページのURLを取得する方法や、
IEなどが複数起動している際にその全てを取得すること
がどうしてもできませんでしたので、教えていただけないかと思った次第です。

もし何かそのような関連のことでわかる方が居ましたら、教えていただければ幸いです。


大豆Z  2005-04-09 19:39:29  No: 14183

http://www.google.co.jp/search?hl=ja&q=IE+url+%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%E3%80%80%E3%83%8F%E3%83%B3%E3%83%89%E3%83%AB&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=

上から2番目


choro  2005-04-10 00:16:24  No: 14184

大豆Zさん、ご返答ありがとうございます。

しかし、見ては見たのですが、やはりブラウザが複数起動している際に、全てのURLを取得することや、タブブラウザで開いている全てのページのURLの取得は出来ませんでした。
複数のブラウザからのURL取得はできそうなのですが、
やはりタブブラウザからの取得が難しそうです。
一応、そのような機能を搭載したソフトもでまわっていますので、
出来ないことはないと思うのですが。。。

ちなみに、タブブラウザ、ブラウザのファイル名などは取得することが可能ですので、そこの心配はありません。

一応、今考えている複数のブラウザからのURL取得は
1.起動中の実行ソフトの中に、ブラウザがあるか調べる
2.あるならば、そのソフトからURLを取得
という流れで、複数のブラウザからURLを取得しようと試みています。
もし、こちらでももっと単純な方法があるのであればご教授願いたいです。

ただ、やはりタブブラウザとなると勝手が違いまして。。。
タブブラウザで現在開いているURLなら取得できるのですが、開いていないほかのページのURLが取得できないのです。
そこら辺のところについてわかることがありましたら宜しくお願いします。


choro  2005-04-10 10:59:13  No: 14185

追加での質問、報告です。

EnumWindowsを使うことにより、トップウィンドウを列挙して、
IEや、ネットエスケープ、登録してブラウザなどをみつけ、
さらにその見つけたソフトの子ウィンドウの中からEditを探し出し、
そのEdit  =  URLが入力されているEdit  
と決め付け、複数のブラウザからURLを取得することはできました。
(大豆Zさん提示のURLを参考にさせていただいています)

しかし、やはりまだ  タブブラウザについてはうまくいきません。
というよりも今の自分ではまったく解決方法が浮かばないのです。
自分でも調べてはいるのですが、どうしても人を頼りにする形になってしまい申し訳ありません。

また、上でも述べたように
見つけたEdit  =  URLが入力されているEdit  
と決め付けて作業しているために、
Editのテキストが変更されてしまうと、うまくURLが取得できません。
また、ブラウザによってはEditすらないものもあるはずです。

そのようなところを考慮しての、URLの取得方法ももしわかるかたがいらっしゃれば宜しくお願いいたします。

こんなのどう?  という漠然とした情報や、ちょっとした参考になりそうなヒントなどもありましたら、
間違った情報でもなにでもかまいませんので、教えていただければ幸いです。


kkk  2005-04-10 11:13:35  No: 14186

タブブラウザといっても色々あるのでどのタブブラウザかを書いたほうがより判断しやすいと思います。


choro  2005-04-10 11:25:53  No: 14187

そうですよね。kkkさん、ご指摘ありがとうございます。
一応、ブラウザは使用者によって追加できるようにしてありますので、
「〜です」とは一概にいえないですが、
一応、自分は、' Sleipnir ' にて、せめて動作確認したいと思っております。
ですが、あまりそこはこだわらないですので、あくまで参考までによろしくお願いいたします。  

また、自分が考えているタブブラウザというのは、
ひとつの実行ファイル内に、タブを使い複数のウェブページを持っているもののことをさしています。
自分の国語力では、表現が難しく、これが精一杯の表現です。
具体例を挙げるならば、  
'Sleipnir' ,  'Donut' ,  'Moon Browser'
などが有名でしょうか。
Sleipnirの配布先は http://sleipnir.pos.to/ ですね。
はたしてリンクを張ってよいものだったのでしょうか。。


kkk  2005-04-10 14:23:00  No: 14188

タブブラウザの種類によってタブ機能の実現方法がいろいろあるようで対応したいブラウザ毎に組む必要がありそうです。
とりあえずIEとSleipnirに対応してみました。(Delphi7です)

ちょっと長いけどいいかな?
EnumWindowsでIEかSleipnirを見つけたらそのハンドルをGetBrowserURLに渡してください。TStringListは前もって作成しておいてください。
----------------------------------------------------------
unit u_getURL;

interface

uses
   Classes, Windows;

  function GetBrowserURL(Wnd:HWND; AList: TStringList): string;

implementation

uses
  ActiveX, Shdocvw, MSHTML;

type
  TObjectFromLResult = function(LRESULT: lResult; const IID: TIID;
    wParam: wParam; out pObject): HRESULT; stdcall;

function GetIEFromHWND(WHandle: HWND; var IE: IWebbrowser2): HRESULT;
var
  hInst: HWND;
  lRes: Cardinal;
  Msg: Integer;
  pDoc: IHTMLDocument2;
  ObjectFromLresult: TObjectFromLresult;
begin
  hInst := LoadLibrary('Oleacc.dll'); @ObjectFromLresult :=
    GetProcAddress(hInst, 'ObjectFromLresult');
  if @ObjectFromLresult <> nil then
  begin
    try
      Msg := RegisterWindowMessage('WM_HTML_GETOBJECT');
      SendMessageTimeOut(WHandle, Msg, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
      Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);
      if Result = S_OK then
        (pDoc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp,
          IWebbrowser2, IE);
    finally
      FreeLibrary(hInst);
    end;
  end;
end;

function GetBrowserURL(Wnd:HWND; AList: TStringList): string;

  procedure AddURL(w:HWND);
  var
    IE: IWebBrowser2;
    S: string;
  begin
    if w = 0 then Exit;
    w := FindWindowEX(w, 0, 'Shell DocObject View', nil);
    if w = 0 then Exit;
    w := FindWindowEX(w, 0, 'Internet Explorer_Server', nil);
    if w <> 0 then
    begin
      GetIEFromHWnd(w, IE);  // Get Iwebbrowser2 from Handle
      if IE <> nil then
      begin
        S := IE.LocationURL;
        if (Length(S) > 0) and (AList <> nil) then
          AList.Add(S);
      end;
    end;
  end;
  procedure GetTabUrl(w: HWND);
  begin
//    w := FindWindowEX(w, 0, nil, 'Sleipnir_IEView');
    w := FindWindowEX(w, 0, nil, nil);
    if w = 0 then Exit;
    w := FindWindowEX(w, 0, 'Shell Embedding', nil);
    AddUrl(w);
  end;

var
  WndChild: HWND;
begin
  Result := '';
  WndChild := FindWindowEX(Wnd, 0, 'MDIClient', nil);
  if WndChild <> 0 then // Sleipnir ?
    begin
      Wnd      := WndChild;
      WndChild := 0;
      repeat
        WndChild := FindWindowEX(Wnd, WndChild, nil, nil);
        if WndCHild <> 0 then
          GetTabUrl(WndChild);
      until WndChild = 0;
    end
  else  // IE?
    AddURL(Wnd);
end;

end.


kkk  2005-04-10 14:24:37  No: 14189

ちなみに上のコードではFirefoxには対応できません。


kkk  2005-04-10 14:28:36  No: 14190

おっとミスが・・・
誤:function GetBrowserURL(Wnd:HWND; AList: TStringList): string;
ではなくて
正:procedure GetBrowserURL(Wnd:HWND; AList: TStringList);
としてください。
よってbeginの直後の
 Result := '';
も削除してください。


kkk  2005-04-10 14:34:22  No: 14191

連続ですいません。
参考したサイトを書くのを忘れていました。
http://www.swissdelphicenter.ch/torry/showcode.php?id=2354


kkk  2005-04-10 15:47:56  No: 14192

'Sleipnir' ,  'Donut' ,  'Moon Browser'で確認しました。
ブラウザのトップのWindowHandleさえ見つかれば先ほどのルーチンでURLの取り込みができるようです。
IE系は大丈夫のようですね。
ただMozilla系は上記で使用しているDLLが使用できないので上記ルーチンでは無理です。
GeckoSDKを使用すればできるかも知れませんが?


choro  2005-04-11 07:50:02  No: 14193

無事、タブブラウザからのURL取得に成功いたしました。
海外サイトでしたか。。。
そこまでは調べが行き届いておりませんでした。
申し訳ありません><

こちらでも、いくつかブラウザを使い検証してみましたが、
やはり無理なものもありますね。
そのようなタブブラウザ場合、全てのURLを取得するのはまだまだ時間がかかりそうですので、
一度ここまでで少し妥協しようかと思います。
またこちらに割く時間が出来ましたら、挑戦してみようかとおもいます。

kkkさん、有益なサンプル、そして確認などまでしていただきありがとうございました。
とても感謝しています^^
一度、これにて解決とさせていただきます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加