ウィンドウをフォアグラウンドに設定できません(Delphi)

Dec 28 2020

これは、ウィンドウを復元してフォアグラウンドに設定するために使用するコードです。ウィンドウが最小化されている場合、コードは完全に機能しますが、ウィンドウが他のウィンドウの背後に隠れている場合、ウィンドウを前面に表示できず、後でSetForegroundWindow(Handle)falseが返されることがわかりました。ただし、プログラムをデバッグモードで実行すると、ウィンドウを前面に表示できます。何が原因でこれが起こっているのか理解できないようです。

function EnumWindowsCallback(Handle: HWND; lParam: Integer): bool; stdcall;
var
  WID, PID: Integer;
begin
  WID := 0;
  PID := lParam;
  GetWindowThreadProcessId(Handle, @WID);
  if (PID = WID) and IsWindowVisible(Handle) then begin
    ShowWindow(Handle, SW_RESTORE);
    SetForegroundWindow(Handle);
    FlashWindow(Handle, True);
  end;
  Result := True;
end;

function ShowProcessWindow(PID: Integer): boolean;
begin
  Result := EnumWindows(@EnumWindowsCallback, lParam(PID))
end;

ここで、PIDは、復元してフォアグラウンドに設定するウィンドウのプロセスIDです。

更新:ドキュメントでこれを読んだだけです。それは関連しているでしょうか?

ユーザーが別のウィンドウで作業している間、アプリケーションはウィンドウを強制的にフォアグラウンドにすることはできません。代わりに、Windowsはウィンドウのタスクバーボタンを点滅させてユーザーに通知します。

回答

1 JiaLin Dec 29 2020 at 10:09

SetForegroundWindow(Handle)次の2行のコードに置き換えたところ、自分のサイトで機能します。

SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NoMove or SWP_NoSize);
SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NoMove or SWP_NoSize);