2013-03-18 30 views
9

我使用这个德尔福7的代码,如果正在运行Internet Explorer检测:为什么FindWindow()不是100%可靠?

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函数()在某些系统上的不可靠?

+1

[FindWindow](http://msdn.microsoft.com/en-us/library/windows/desktop/ms633499(v = vs.85).aspx)和[GetWindowText](http ://msdn.microsoft.com/en-us/library/windows/desktop/ms633520(v = vs.85)MSDN上的.aspx)页可能会提供一些线索。 – 2013-03-18 05:03:15

+9

而是通过Windows手动循环的,你应该使用['EnumWindows的()'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms633497.aspx)来代替。 – 2013-03-18 05:14:03

+1

Remy,EnumWindows()需要一个回调函数,所以不能用在内联代码中。在这种情况下需要事件处理。而且我必须在EnumWindows()被称为ANYWAY之后循环。我在其他应用程序中使用EnumWindows(),而且速度也很慢。但是在附注中,它仍不能解释为什么FindWindow()在99%的系统上工作,但不在1%上。 – Casady 2013-03-18 05:27:32

回答

1

我猜FindWindow声明为返回一个窗口句柄,这是一个THandle,这是一个整数,它被签署。 (至少,我觉得很多年前,这是当我在Delphi编程的情况下)。

如果IE有设置,那么这将是负的,因此你的测试将返回False最高位窗口句柄:

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

窗户把手通常没有最高位设置,但我不知道这是不可能的。

+0

我确定WinControl句柄由Microsoft定义为typedef void * HANDLE; - 因此它们不能是负面的。我在这里想念什么?但你可能会在这里。将不得不检查出来。 – Casady 2013-03-19 04:50:46

+0

arx,我在Delphi 7中检查了HWND的定义:HWND = type LongWord;所以它不能是负面的。 – Casady 2013-03-19 06:04:36

+0

@casady如果是这种情况,那么>与<>相同,但是您选择了什么>?这是我经常看到的东西。如果未找到窗口,则函数返回0.因此,= 0的否定为<> 0。我无法想象什么逻辑导致> 0。 – 2013-03-19 07:54:03

相关问题