Tidak dapat menyetel jendela ke latar depan (Delphi)

Dec 28 2020

Berikut adalah kode yang saya gunakan untuk memulihkan dan mengatur jendela ke latar depan. Ketika jendela diminimalkan, kode bekerja dengan baik tetapi ketika jendela bersembunyi di balik beberapa jendela lain, saya tidak dapat membawa jendela ke latar depan kemudian saya menemukan bahwa SetForegroundWindow(Handle)terus kembali palsu. Namun, jika saya menjalankan program dalam mode debugging, jendela dapat dibawa ke latar depan. Saya tidak tahu apa yang menyebabkan ini terjadi.

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;

Di mana PID adalah id proses dari jendela yang ingin saya pulihkan dan setel ke latar depan.

Pembaruan: Saya baru saja membaca ini di dokumentasi . Mungkinkah itu terkait?

Aplikasi tidak dapat memaksa jendela ke latar depan saat pengguna bekerja dengan jendela lain. Sebagai gantinya, Windows mem-flash tombol bilah tugas di jendela untuk memberi tahu pengguna.

Jawaban

1 JiaLin Dec 29 2020 at 10:09

Saya mengganti SetForegroundWindow(Handle)dengan 2 baris kode berikut dan berfungsi di situs saya:

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