我使用這個德爾福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函數()在某些系統上的不可靠?
[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
而是通過Windows手動循環的,你應該使用['EnumWindows的()'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms633497.aspx)來代替。 – 2013-03-18 05:14:03
Remy,EnumWindows()需要一個回調函數,所以不能用在內聯代碼中。在這種情況下需要事件處理。而且我必須在EnumWindows()被稱爲ANYWAY之後循環。我在其他應用程序中使用EnumWindows(),而且速度也很慢。但是在附註中,它仍不能解釋爲什麼FindWindow()在99%的系統上工作,但不在1%上。 – Casady 2013-03-18 05:27:32