ただいま、起動中のブラウザからURLを取得しようと考えております。
色々探してみましたが、
タブブラウザから開いている全てのページのURLを取得する方法や、
IEなどが複数起動している際にその全てを取得すること
がどうしてもできませんでしたので、教えていただけないかと思った次第です。
もし何かそのような関連のことでわかる方が居ましたら、教えていただければ幸いです。
上から2番目
大豆Zさん、ご返答ありがとうございます。
しかし、見ては見たのですが、やはりブラウザが複数起動している際に、全てのURLを取得することや、タブブラウザで開いている全てのページのURLの取得は出来ませんでした。
複数のブラウザからのURL取得はできそうなのですが、
やはりタブブラウザからの取得が難しそうです。
一応、そのような機能を搭載したソフトもでまわっていますので、
出来ないことはないと思うのですが。。。
ちなみに、タブブラウザ、ブラウザのファイル名などは取得することが可能ですので、そこの心配はありません。
一応、今考えている複数のブラウザからのURL取得は
1.起動中の実行ソフトの中に、ブラウザがあるか調べる
2.あるならば、そのソフトからURLを取得
という流れで、複数のブラウザからURLを取得しようと試みています。
もし、こちらでももっと単純な方法があるのであればご教授願いたいです。
ただ、やはりタブブラウザとなると勝手が違いまして。。。
タブブラウザで現在開いているURLなら取得できるのですが、開いていないほかのページのURLが取得できないのです。
そこら辺のところについてわかることがありましたら宜しくお願いします。
追加での質問、報告です。
EnumWindowsを使うことにより、トップウィンドウを列挙して、
IEや、ネットエスケープ、登録してブラウザなどをみつけ、
さらにその見つけたソフトの子ウィンドウの中からEditを探し出し、
そのEdit = URLが入力されているEdit
と決め付け、複数のブラウザからURLを取得することはできました。
(大豆Zさん提示のURLを参考にさせていただいています)
しかし、やはりまだ タブブラウザについてはうまくいきません。
というよりも今の自分ではまったく解決方法が浮かばないのです。
自分でも調べてはいるのですが、どうしても人を頼りにする形になってしまい申し訳ありません。
また、上でも述べたように
見つけたEdit = URLが入力されているEdit
と決め付けて作業しているために、
Editのテキストが変更されてしまうと、うまくURLが取得できません。
また、ブラウザによってはEditすらないものもあるはずです。
そのようなところを考慮しての、URLの取得方法ももしわかるかたがいらっしゃれば宜しくお願いいたします。
こんなのどう? という漠然とした情報や、ちょっとした参考になりそうなヒントなどもありましたら、
間違った情報でもなにでもかまいませんので、教えていただければ幸いです。
タブブラウザといっても色々あるのでどのタブブラウザかを書いたほうがより判断しやすいと思います。
そうですよね。kkkさん、ご指摘ありがとうございます。
一応、ブラウザは使用者によって追加できるようにしてありますので、
「〜です」とは一概にいえないですが、
一応、自分は、' Sleipnir ' にて、せめて動作確認したいと思っております。
ですが、あまりそこはこだわらないですので、あくまで参考までによろしくお願いいたします。
また、自分が考えているタブブラウザというのは、
ひとつの実行ファイル内に、タブを使い複数のウェブページを持っているもののことをさしています。
自分の国語力では、表現が難しく、これが精一杯の表現です。
具体例を挙げるならば、
'Sleipnir' , 'Donut' , 'Moon Browser'
などが有名でしょうか。
Sleipnirの配布先は http://sleipnir.pos.to/ ですね。
はたしてリンクを張ってよいものだったのでしょうか。。
タブブラウザの種類によってタブ機能の実現方法がいろいろあるようで対応したいブラウザ毎に組む必要がありそうです。
とりあえず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.
ちなみに上のコードではFirefoxには対応できません。
おっとミスが・・・
誤:function GetBrowserURL(Wnd:HWND; AList: TStringList): string;
ではなくて
正:procedure GetBrowserURL(Wnd:HWND; AList: TStringList);
としてください。
よってbeginの直後の
Result := '';
も削除してください。
連続ですいません。
参考したサイトを書くのを忘れていました。
http://www.swissdelphicenter.ch/torry/showcode.php?id=2354
'Sleipnir' , 'Donut' , 'Moon Browser'で確認しました。
ブラウザのトップのWindowHandleさえ見つかれば先ほどのルーチンでURLの取り込みができるようです。
IE系は大丈夫のようですね。
ただMozilla系は上記で使用しているDLLが使用できないので上記ルーチンでは無理です。
GeckoSDKを使用すればできるかも知れませんが?
無事、タブブラウザからのURL取得に成功いたしました。
海外サイトでしたか。。。
そこまでは調べが行き届いておりませんでした。
申し訳ありません><
こちらでも、いくつかブラウザを使い検証してみましたが、
やはり無理なものもありますね。
そのようなタブブラウザ場合、全てのURLを取得するのはまだまだ時間がかかりそうですので、
一度ここまでで少し妥協しようかと思います。
またこちらに割く時間が出来ましたら、挑戦してみようかとおもいます。
kkkさん、有益なサンプル、そして確認などまでしていただきありがとうございました。
とても感謝しています^^
一度、これにて解決とさせていただきます。
ツイート | ![]() |