Fenster kann nicht in den Vordergrund gesetzt werden (Delphi)

Dec 28 2020

Hier ist der Code, mit dem ich ein Fenster wiederherstelle und in den Vordergrund setze. Wenn das Fenster minimiert ist, funktioniert der Code einwandfrei, aber wenn sich das Fenster hinter einigen anderen Fenstern versteckt, kann ich das Fenster nicht in den Vordergrund bringen. Später fand ich heraus, dass SetForegroundWindow(Handle)immer wieder false zurückgegeben wurde. Wenn ich das Programm jedoch im Debugging-Modus ausführe, kann das Fenster in den Vordergrund gerückt werden. Ich kann nicht herausfinden, was dies verursacht.

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;

Wobei PID die Prozess-ID des Fensters ist, das ich wiederherstellen und in den Vordergrund stellen möchte.

Update: Ich habe dies gerade in der Dokumentation gelesen . Könnte es verwandt sein?

Eine Anwendung kann ein Fenster nicht in den Vordergrund zwingen, während der Benutzer mit einem anderen Fenster arbeitet. Stattdessen blinkt Windows die Taskleistenschaltfläche des Fensters, um den Benutzer zu benachrichtigen.

Antworten

1 JiaLin Dec 29 2020 at 10:09

Ich habe durch SetForegroundWindow(Handle)die folgenden 2 Codezeilen ersetzt und es funktioniert auf meiner Website:

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);