2


0

フロントブラウザウィンドウが既に実行されている場合はそれを持ってくるか、アプリケーションからブラウザを起動する必要があります。 私は現在、新しいブラウザを開くためにShellExecuteを使用していますが、最終的には多くのブラウザインスタンスまたはタブを作成します。 それでは、ブラウザが既に実行されているかどうかを確認して、アプリケーションをブラウザに切り替えるにはどうすればいいのでしょうか。

私は現在これを使っています:

ShellExecute(ハンドル、 '開く'、URL、nil、nil、SW_SHOWNORMAL);

3 Answer


3


関数EnumProcess(ハンドル:HWND; lパラメータ:整数):BOOL; stdcall; var PID:カーディナル。タイトル:文字列。 Handle = NULLの場合に開始してから開始してください。それ以外の場合は終了GetWindowThreadProcessID(Handle、PID); PID = lParamの場合それからSetForegroundWindow(Handle)を開始します。結果:= False。それ以外の場合結果:= True;終わり;終わり;

TMainForm.StartBrowser(); var h:HWND; S:tagPROCESSENTRY32; bFound:ブール値。開始h:= CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS、0); S.dwSize:= SizeOf(tagPROCESSENTRY32);プロセス32最初(h、S); bFound:= false;一方、Pos( 'iexplore'、LowerCase(S.szExeFile))<> 0の場合、Process32Next(h、S)は開始します。bFound:= true; EnumWindows(@ EnumProcess、Integer(Pointer(S.th32ProcessID)));終わり;終わり; bFoundではない場合、ShellExecute(Handle、 'open'、 'http://www.stackoverflow.com'、nil、nil、SW_SHOWNORMAL);終わり;


1


あなたがしている方法は、デフォルトのブラウザを開く方法です。 これに関する問題は、IEとFirefoxの両方が、関連するタブを前面に表示するのではなく、常にドキュメントを再び開くように見えることです。

私はあなたがコマンドラインスイッチでブラウザ特有のことをすることができるかもしれないと思った。 その場合は、HKEY_CLASSES_ROOT \ HTTP \ shell \ open \ commandからデフォルトのブラウザを入手する必要があります。

残念ながら、2つの主要ブラウザのどちらにも、まだ開かれていないURLのみを開くように切り替えるスイッチはありません。 (IEは hereを、Firefoxはhttp://kb.mozillazine.org/Command_line_arguments[here]を切り替えます) また、非タブブラウジングの時代には、私はあなたが EnumWindowsを実行しても、それはもううまくいきません。

私のアドバイス:

  1. デフォルトのブラウザを確認する

  2. IEの場合は Icebobのコードを使用してください。 明示的にサポートしていないブラウザにも、これまたは現在のShellExecuteコードを使用してください。

  3. Firefoxの場合は、developer.mozilla.orgを調べてください。 何らかの方法があるはずです。

  4. webkit(Chrome、Safari)とOperaも同じです。

または重複して住んでいます。 その場合、あなたのShellExecuteコードは完璧です。

私はおそらく複製と一緒に暮らすでしょう。


0


おそらく最善の策は、既存のウィンドウを見つけるためにDDEを使用することです。

また、open動詞をハードコーディングすることはお勧めできません。NULL/ nilを渡すことをお勧めします。