11

我正在使用这个 Delphi 7 代码来检测 Internet Explorer 是否正在运行:

function IERunning: Boolean;
begin
  Result := FindWindow('IEFrame', NIL) > 0;
end;

这适用于 99% 的 IE 8,9 和 10 系统。

但是有一些系统(不幸的是我没有,但我有两个拥有此类系统的 beta 测试人员,都是 Win7 x64 SP1),其中 FindWindow() 为 IEFrame 返回 0,即使 IE 在内存中也是如此。

所以我编写了另一种方法来查找窗口:

function IERunningEx: Boolean;
var WinHandle : HWND;
    Name: array[0..255] of Char;
begin
  Result := False; // assume no IE window is present

  WinHandle := GetTopWindow(GetDesktopWindow);

  while WinHandle <> 0 do // go thru the window list
  begin
      GetClassName(WinHandle, @Name[0], 255);
      if (CompareText(string(Name), 'IEFrame') = 0) then
      begin // IEFrame found
          Result := True;
          Exit;             
      end;
      WinHandle := GetNextWindow(WinHandle, GW_HWNDNEXT);
  end;      
end;

替代方法适用于 100% 的所有系统。

我的问题 - 为什么 FindWindow() 在某些系统上不可靠?

4

2 回答 2

3

我猜它FindWindow被声明为返回一个 WinHandle,它是一个 THandle,它是一个 Integer,它是有符号的。(至少,我认为很多年前我在 Delphi 中编程时就是这种情况。)

如果 IE 有一个设置了最高位的窗口句柄,那么它将为负,因此您的测试将返回 False:

Result := FindWindow('IEFrame', NIL) > 0;

窗口句柄通常不会设置最高位,但我不知道这是不可能的。

于 2013-03-19T00:21:48.757 回答
2

根据 Delphi Help,FindWindow(ClassName,WindowName) 不搜索子窗口。这可能是 1% 失败的原因。也许在这两个 beta 测试系统中,IEFrame 窗口设置了 WS_CHILD 样式。

这可以解释为什么 GetTopWindow/GetNextWindow 循环有效。GetTopWindow(hWndParent) 检索 Z 顺序顶部的子窗口,GetNextWindow(hWnd,Direction) 检索 Z 顺序中的下一个子窗口。

这可以通过调用 FindWindowEx(hWndParent,hWndChild,ClassName,WindowName) 来测试,看看它在 FindWindow() 失败的地方是否有效。

于 2018-06-22T14:06:32.370 回答