Я использую этот Delphi 7 кода, чтобы обнаружить, если Internet Explorer работает:Почему FindWindow() не надежно на 100%?
function IERunning: Boolean;
begin
Result := FindWindow('IEFrame', NIL) > 0;
end;
Это работает на 99% систем с IE 8,9 и 10.
Но есть некоторые системы (к сожалению, ни один из моих, но у меня есть два бета-тестера, у которых есть такие системы, как Win7 x64 SP1), где FindWindow() возвращает 0 для IEFrame, даже если 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) .aspx) в MSDN, которые могут предоставить некоторые подсказки. –
Вместо того, чтобы переходить через окна вручную, вы должны использовать ['EnumWindows()'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms633497.aspx). –
Remy, EnumWindows() требуется функция обратного вызова, поэтому ее нельзя использовать во встроенном коде. В этом случае требуется обработка событий. И мне нужно будет зацикливаться после того, как EnumWindows() будет вызван ANYWAY. Я использую EnumWindows() в других приложениях, и это довольно медленно. Но с другой стороны, он все еще не объясняет, почему FindWindow() работает на 99% системах, но не на 1%. – Casady