Incapaz de definir a janela para primeiro plano (Delphi)

Dec 28 2020

Aqui está o código que uso para restaurar e definir uma janela para o primeiro plano. Quando a janela é minimizada, o código funciona perfeitamente, mas quando a janela está escondida atrás de outras janelas, não consigo trazer a janela para o primeiro plano, então descobri mais tarde que SetForegroundWindow(Handle)continuava retornando false. No entanto, se eu executar o programa no modo de depuração, a janela pode ser colocada em primeiro plano. Não consigo descobrir o que está causando isso.

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;

Onde PID é a identificação do processo da janela que desejo restaurar e definir como primeiro plano.

Atualização: Acabei de ler isso na documentação . Isso poderia estar relacionado?

Um aplicativo não pode forçar uma janela para o primeiro plano enquanto o usuário estiver trabalhando com outra janela. Em vez disso, o Windows pisca o botão da barra de tarefas da janela para notificar o usuário.

Respostas

1 JiaLin Dec 29 2020 at 10:09

Substituí SetForegroundWindow(Handle)pelas 2 linhas de código a seguir e funciona no meu site:

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