Nie można ustawić okna na pierwszy plan (Delphi)

Dec 28 2020

Oto kod, którego używam do przywracania i ustawiania okna na pierwszy plan. Kiedy okno jest zminimalizowane, kod działa poprawnie, ale kiedy okno chowa się za innymi oknami, nie mogę przenieść okna na pierwszy plan, a później okazało się, że SetForegroundWindow(Handle)ciągle zwracał fałsz. Jeśli jednak uruchomię program w trybie debugowania, okno może zostać przeniesione na pierwszy plan. Nie mogę zrozumieć, co jest tego przyczyną.

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;

Gdzie PID to identyfikator procesu okna, które chcę przywrócić i ustawić na pierwszym planie.

Aktualizacja: właśnie przeczytałem to w dokumentacji . Czy to może być powiązane?

Aplikacja nie może wymusić przesunięcia okna na pierwszy plan, gdy użytkownik pracuje z innym oknem. Zamiast tego system Windows miga przycisk paska zadań okna, aby powiadomić użytkownika.

Odpowiedzi

1 JiaLin Dec 29 2020 at 10:09

Zastąpiłem SetForegroundWindow(Handle)następującymi 2 liniami kodu i działa na mojej stronie:

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