我需要带前端浏览器窗口(如果它已在运行)或从我的应用程序启动浏览器。我现在使用ShellExecute打开一个新的浏览器,但最终会创建许多浏览器实例或标签。那么如何检查浏览器是否已经运行并将应用程序切换到浏览器?
我目前正在使用它:
ShellExecute(Handle, 'open', URL, nil, nil, SW_SHOWNORMAL);
答案 0 :(得分:3)
function EnumProcess(Handle: HWND; lParam: Integer): BOOL; stdcall;
var
PID : Cardinal;
Title : String;
begin
If Handle = NULL Then
begin
Result := False;
end
Else
begin
GetWindowThreadProcessID(Handle,PID);
If PID = lParam Then
begin
SetForegroundWindow(Handle);
Result := False;
end
else
Result := True;
end;
end;
procedure TMainForm.StartBrowser();
var
h: HWND;
S: tagPROCESSENTRY32;
bFound: boolean;
begin
h := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
S.dwSize := SizeOf(tagPROCESSENTRY32);
Process32First(h, S);
bFound := false;
while Process32Next(h, S) do
begin
if Pos('iexplore', LowerCase(S.szExeFile)) <> 0 then
begin
bFound := true;
EnumWindows(@EnumProcess,Integer(Pointer(S.th32ProcessID)));
end;
end;
if (not bFound) then
ShellExecute(Handle, 'open', 'http://www.stackoverflow.com', nil, nil, SW_SHOWNORMAL);
end;
答案 1 :(得分:1)
您正在这样做的方式是打开默认浏览器。问题在于IE和Firefox都会重新打开文档,而不是将相关标签放在前面。
我认为您可以使用命令行开关执行特定于浏览器的操作。在这种情况下,您应该从HKEY_CLASSES_ROOT \ HTTP \ shell \ open \ command获取默认浏览器。
不幸的是,两个主流浏览器都没有切换到只打开尚未打开的URL。 (IE切换here,Firefox切换here)。此外,在非标签式浏览的时代,我会鼓励您查看EnumWindows以查找相关会话,但这不再适用于AFAIK。
我的建议:
或者与重复一起生活。在这种情况下,您的ShellExecute代码是完美的。
我可能会使用重复项。
答案 2 :(得分:0)
您最好的选择可能是使用DDE查找现有窗口。
另外,对开放动词进行硬编码并不是一个好主意,最好传递NULL / nil