ウィンドウをフォアグラウンドに設定できません(Delphi)
これは、ウィンドウを復元してフォアグラウンドに設定するために使用するコードです。ウィンドウが最小化されている場合、コードは完全に機能しますが、ウィンドウが他のウィンドウの背後に隠れている場合、ウィンドウを前面に表示できず、後で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
SetForegroundWindow(Handle)
次の2行のコードに置き換えたところ、自分のサイトで機能します。
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);