Không thể đặt cửa sổ thành nền trước (Delphi)

Dec 28 2020

Đây là mã mà tôi sử dụng để khôi phục và đặt cửa sổ thành nền trước. Khi cửa sổ được thu nhỏ, mã hoạt động hoàn hảo nhưng khi cửa sổ ẩn sau một số cửa sổ khác, tôi không thể đưa cửa sổ lên nền trước, sau đó tôi phát hiện ra rằng nó SetForegroundWindow(Handle)tiếp tục trả về sai. Tuy nhiên, nếu tôi chạy chương trình ở chế độ gỡ lỗi, cửa sổ có thể được đưa lên nền trước. Tôi dường như không thể hiểu được điều gì đang gây ra điều này.

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;

Trong đó PID là id quy trình của cửa sổ mà tôi muốn khôi phục và đặt thành nền trước.

Cập nhật: Tôi vừa đọc điều này trong tài liệu . Nó có thể được liên quan?

Một ứng dụng không thể buộc một cửa sổ lên nền trước trong khi người dùng đang làm việc với một cửa sổ khác. Thay vào đó, Windows sẽ nhấp nháy nút thanh tác vụ của cửa sổ để thông báo cho người dùng.

Trả lời

1 JiaLin Dec 29 2020 at 10:09

Tôi đã thay thế SetForegroundWindow(Handle)bằng 2 dòng mã đang chạy và nó hoạt động trên trang web của tôi:

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