No se puede establecer la ventana en primer plano (Delphi)

Dec 28 2020

Aquí está el código que utilizo para restaurar y establecer una ventana en primer plano. Cuando la ventana está minimizada, el código funciona perfectamente, pero cuando la ventana se esconde detrás de otras ventanas, no puedo traer la ventana al primer plano y luego descubrí que SetForegroundWindow(Handle)seguía siendo falso. Sin embargo, si ejecuto el programa en modo de depuración, la ventana se puede traer al primer plano. Parece que no puedo entender qué está causando esto.

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;

Donde PID es el ID de proceso de la ventana que quiero restaurar y establecer en primer plano.

Actualización: acabo de leer esto en la documentación . ¿Podría estar relacionado?

Una aplicación no puede forzar una ventana al primer plano mientras el usuario está trabajando con otra ventana. En su lugar, Windows muestra el botón de la barra de tareas de la ventana para notificar al usuario.

Respuestas

1 JiaLin Dec 29 2020 at 10:09

He sustituido SetForegroundWindow(Handle)con los follwoing 2 líneas de código y funciona en mi sitio:

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