Невозможно установить окно на передний план (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 - это идентификатор процесса окна, которое я хочу восстановить и установить на передний план.

Обновление: я только что прочитал это в документации . Может ли это быть связано?

Приложение не может вывести окно на передний план, пока пользователь работает с другим окном. Вместо этого Windows мигает кнопкой панели задач окна, чтобы уведомить пользователя.

Ответы

1 JiaLin Dec 29 2020 at 10:09

Я заменил SetForegroundWindow(Handle)следующие две строки кода, и он работает на моем сайте:

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