Impossible de définir la fenêtre au premier plan (Delphi)

Dec 28 2020

Voici le code que j'utilise pour restaurer et définir une fenêtre au premier plan. Lorsque la fenêtre est minimisée, le code fonctionne parfaitement, mais lorsque la fenêtre se cache derrière d'autres fenêtres, je ne peux pas amener la fenêtre au premier plan, puis j'ai découvert plus tard qu'elle SetForegroundWindow(Handle)retournait toujours false. Cependant, si j'exécute le programme en mode débogage, la fenêtre peut être amenée au premier plan. Je n'arrive pas à comprendre ce qui cause cela.

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;

Où PID est l'identifiant de processus de la fenêtre que je souhaite restaurer et mettre au premier plan.

Mise à jour: je viens de lire ceci dans la documentation . Cela pourrait-il être lié?

Une application ne peut pas forcer une fenêtre au premier plan pendant que l'utilisateur travaille avec une autre fenêtre. Au lieu de cela, Windows fait clignoter le bouton de la barre des tâches de la fenêtre pour avertir l'utilisateur.

Réponses

1 JiaLin Dec 29 2020 at 10:09

J'ai remplacé SetForegroundWindow(Handle)par les 2 lignes de code suivantes et cela fonctionne sur mon 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);