【发布时间】:2010-11-09 15:13:10
【问题描述】:
如果它已经在运行,我需要打开前浏览器窗口,或者从我的应用程序启动浏览器。我现在使用 ShellExecute 打开一个新浏览器,但它最终会创建许多浏览器实例或选项卡。那么如何检查浏览器是否已经运行并将应用切换到浏览器呢?
我目前正在使用这个:
ShellExecute(Handle, 'open', URL, nil, nil, SW_SHOWNORMAL);
【问题讨论】:
如果它已经在运行,我需要打开前浏览器窗口,或者从我的应用程序启动浏览器。我现在使用 ShellExecute 打开一个新浏览器,但它最终会创建许多浏览器实例或选项卡。那么如何检查浏览器是否已经运行并将应用切换到浏览器呢?
我目前正在使用这个:
ShellExecute(Handle, 'open', URL, nil, nil, SW_SHOWNORMAL);
【问题讨论】:
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;
【讨论】:
您这样做的方式是打开默认浏览器的方式。问题在于 IE 和 Firefox 似乎总是会重新打开文档,而不是将相关选项卡置于最前面。
我认为您可以使用命令行开关来执行特定于浏览器的操作。在这种情况下,您应该从 HKEY_CLASSES_ROOT\HTTP\shell\open\command 获取默认浏览器。
不幸的是,这两个主要浏览器都没有一个开关来只打开一个尚未打开的 URL。 (IE 开关 here,Firefox 开关 here)。此外,在非标签式浏览的日子里,我会鼓励您查看EnumWindows 以查找相关会话,但这不再适用于 AFAIK。
我的建议:
或与重复项一起生活。在这种情况下,您的 ShellExecute 代码是完美的。
我可能会忍受重复。
【讨论】:
您最好的选择可能是使用 DDE 来查找现有窗口。
另外,硬编码开放动词不是一个好主意,最好传递 NULL/nil
【讨论】: