창을 전경으로 설정할 수 없음 (Delphi)

Dec 28 2020

다음은 창을 전경으로 복원하고 설정하는 데 사용하는 코드입니다. 창이 최소화되면 코드가 제대로 작동하지만 창이 다른 창 뒤에 숨어 있으면 창을 전경으로 가져올 수 없으며 나중에 SetForegroundWindow(Handle)계속 false를 반환 한다는 사실을 알게되었습니다 . 그러나 디버깅 모드에서 프로그램을 실행하면 창을 전경으로 가져올 수 있습니다. 나는 이것이 발생하는 원인을 파악할 수 없습니다.

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;

여기서 PID는 복원하고 포 그라운드로 설정하려는 창의 프로세스 ID입니다.

업데이트 : 문서 에서 이것을 읽었습니다 . 관련이있을 수 있습니까?

응용 프로그램은 사용자가 다른 창으로 작업하는 동안 창을 포 그라운드로 강제 할 수 없습니다. 대신 Windows는 창의 작업 표시 줄 단추를 깜박여 사용자에게 알립니다.

답변

1 JiaLin Dec 29 2020 at 10:09

다음 SetForegroundWindow(Handle)두 줄의 코드 로 교체 했고 내 사이트에서 작동합니다.

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