3

デスクトップにフォアグラウンド ウィンドウがあるかどうかを判断する方法はありますか?

これは機能しますが、正しくないようですか?デスクトップ ハンドルにフォアグラウンド ウィンドウがない場合、328992 が返されます。

Handle := GetForegroundWindow;
if Handle = 328992 then
begin
  MessageBox(0, 'There is no active window.', 'No Active Window',   MB_ICONWARNING or MB_OK);
  exit;
end;

これを達成するための最良の方法は何ですか?デルファイ 2010

ファローアップ:

iDesktopWindow := GetDesktopWindow;
iShellWindow := GetShellWindow;
iForegroundWindow := GetForegroundWindow;
ShowMessage('DesktopWindow: ' + IntToStr(iDesktopWindow));
ShowMessage('ShellWindow: ' + IntToStr(iShellWindow));
ShowMessage('ForegroundWindow: ' + IntToStr(iForegroundWindow));

DesktopWindow は 65552 を返します ShellWindow は 65864 を返します ForegroundWindow は 65724 を返します

以前の編集では、アプリが実行されるたびに ForegroundWindow の異なる値が表示されましたが、値を取得する前にアプリケーションを最小化できませんでした。これで、毎回 ForegroundWindow の一貫した値 65724 を取得しています。この場合、アクティブなウィンドウはありません...デスクトップと最小化されたウィンドウだけです。

4

1 に答える 1

2

常にフォアグラウンド ウィンドウがあります。GetForegroundWindowまあ、戻り時に前景ウィンドウが変更されている瞬間がありますNULLが、それらの瞬間はかなり早く過ぎ去ります!

328992デスクトップを表示するために使用されるウィンドウの 1 つのウィンドウ ハンドルだと思います。Spy++ などを使用して、それがどのウィンドウであるかを調べます。私の推測では、検出しようとしている状態は、シェル ウィンドウがフォアグラウンド ウィンドウである場合です。

function GetShellWindow: HWND; stdcall external 'user32.dll';

function IsShellWindowTheForegroundWindow: Boolean;
begin
  Result := GetShellWindow=GetForegroundWindow;
end;
于 2012-08-27T14:50:29.547 に答える