私は、Internet Explorerが実行されているかどうかを検出するために、このDelphi 7のコードを使用しています:FindWindow()が100%信頼できないのはなぜですか?
function IERunning: Boolean;
begin
Result := FindWindow('IEFrame', NIL) > 0;
end;
これはIE 8.9を搭載したシステムの99%の上で動作し、10
しかし、いくつかのシステムがあります(残念ながら鉱山はありませんが、Win7 x64 SP1の2台のベータテスターで、IEがメモリ上にあってもFindWindow()がIEFrameに0を返します)。
だから私は、ウィンドウを見つけるために、別の方法をコード化しました:
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()はいつでも呼び出された後にループする必要があります。私は他のアプリでEnumWindows()を使用していますが、やや遅いです。しかし、それでも、FindWindow()が99%のシステムで動作する理由は説明されていませんが、1%では動作しません。 – Casady