2013-03-18 61 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

相關問題