0

我需要检测特定窗口是否被最小化。为此,我发现了两个功能:

1.

function PAIsWindowMinimized(h: HWND): Boolean;
// Detects whether a window is minimized or not
var
  wp: Winapi.Windows.WINDOWPLACEMENT;
begin
  wp.length := SizeOf(Winapi.Windows.WINDOWPLACEMENT);
  Winapi.Windows.GetWindowPlacement(h, @wp);
  Result := wp.showCmd = Winapi.Windows.SW_SHOWMINIMIZED;  
end;

2.

// Alternative (https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-isiconic):
Winapi.Windows.IsIconic(h);

两种选择中的哪一种更可取?还是它们在所有情况下都同样出色?

4

2 回答 2

9

IsIconic()是检查窗口是否最小化的正确且记录在案的方法:

图标函数

确定指定的窗口是否最小化(图标)。

窗口功能

和函数IsZoomed分别IsIconic确定给定窗口是最大化还是最小化。该GetWindowPlacement函数检索窗口的最小化、最大化和恢复位置,并确定窗口的显示状态。

使用其他任何东西充其量只是一种技巧。事实上,在IsIconic()内部GetWindowPlacement()检查WS_MINIMIZE窗口样式的 HWND 只是一个实现细节。使用这些函数而不是手动检查窗口样式的开销可以忽略不计。

坚持使用IsIconic(),它是 Microsoft 专门为此目的提供的 API。

于 2019-07-09T17:29:36.910 回答
-2

“最好的”替代方法是调用 (GetWindowLong(hwnd, GWL_STYLE) & WS_MINIMIZE).

我检查了反汇编程序中的IsIconicGetWindowPlacement函数,并且两者都在内部将窗口样式与WS_MINIMIZE标志进行比较以确定窗口是否最小化。

于 2019-07-09T14:57:36.083 回答