2013-03-18 53 views
9

私は、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()が信頼できないのはなぜですか?

+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).aspx)MSDNのいくつかの手がかりを提供するかもしれないページ。 –

+9

手動でウィンドウをループするのではなく、代わりに['EnumWindows()'](http://msdn.microsoft.com/en-us/library/windows/desktop/ms633497.aspx)を使用する必要があります。 –

+1

Remy、EnumWindows()はコールバック関数が必要なので、インラインコードでは使用できません。この場合、イベント処理が必要です。そして、EnumWindows()はいつでも呼び出された後にループする必要があります。私は他のアプリでEnumWindows()を使用していますが、やや遅いです。しかし、それでも、FindWindow()が99%のシステムで動作する理由は説明されていませんが、1%では動作しません。 – Casady

答えて

1

FindWindowは、ThandleであるWinHandleを返すと宣言されていると推測しています。これはIntegerであり、署名されています。 (少なくとも、私はDelphiでプログラムされたときに、これは何年も前のケースだったと思います。)

IEは、あなたのテストはFalseを返しますので、それが負になるセットトップビットとウィンドウハンドルがある場合:

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

ウィンドウハンドルには通常上位ビットが設定されていませんが、不可能であることはわかりません。

+0

私はWinControlハンドルがtypedefとしてMicrosoftによって定義されていることを確信しています。void * HANDLE; - したがって、彼らは否定できない。ここで何かが恋しい?しかし、あなたはここに何かあるかもしれません。それをチェックする必要があります。 – Casady

+0

arx、私はDelphi 7でHWNDの定義をチェックしました:HWND = type LongWord;それは否定できない。 – Casady

+0

@casadyそうだとしたら、>は<>と同じですが、何を選んだのでしょうか?>それは私が驚くほど頻繁に見るものです。ウィンドウが見つからない場合、関数は0を返します。したがって、= 0の否定は<> 0です。私は論理が> 0につながるとは想像できません。 –

関連する問題