WinSetRegion

将指定窗口的形状改为指定的矩形, 椭圆或多边形.

WinSetRegion Options, WinTitle, WinText, ExcludeTitle, ExcludeText

参数

Options

类型: 字符串

如果为空或省略, 则窗口恢复到其原始/默认显示形状. 否则, 请指定以下一个或多个选项, 每个选项之间用空格分隔:

Wn: 矩形或椭圆的宽度. 例如: w200.

Hn: 矩形或椭圆的高度. 例如: h200.

X-Y: 每一个都是一对 X/Y 坐标. 例如, 200-0 将使用 200 作为 X 坐标, 0 作为 Y 坐标.

E: 设置窗口形状为椭圆形而不是矩形. 此选项仅在同时指定了 W 和 H 时才有效.

Rw-h: 设置窗口形状为圆角矩形. 例如, r30-30 表示每个角为 30x30 的椭圆. 如果 w-h 省略, 则使用 30-30. R 仅在同时指定了 W 和 H 时才有效.

矩形或椭圆形: 如果指定了 W 和 H 选项, 那么会设置新显示的局域为矩形, 且其左上角的坐标为首个(且唯一) X-Y 坐标对. 但是, 如果同时指定了 E 选项, 那么会设置窗口形状为椭圆形而不是矩形. 例如: WinSetRegion "50-0 w200 h250 E".

多边形: 如果 W 和 H 选项都不存在时, 新的显示区域将是由多个 X-Y 坐标对决定的多边形(每对坐标是窗口内相对于其左上角的一个点). 例如, 如果指定了三对坐标, 那么在多数时候窗口形状会被设置为三角形. 坐标对彼此间的相对顺序有时很重要. 此外, 可以在 Options 中指定单词 Wind 从而使用缠绕法代替变换方法来确定多边形的形状.

WinTitle, WinText, ExcludeTitle, ExcludeText

类型: 字符串, 整数或对象

如果这些都是空白或省略, 将使用上次找到的窗口. 否则, 为 WinTitle 指定窗口标题或其他条件, 来标识目标窗口, 和/或为 WinText 指定目标窗口的单个文本元素的子字符串(由包含的 Window Spy 实用程序显示).

ExcludeTitle 和 ExcludeText 可用于根据标题或文本排除一个或多个窗口. 它们的规范类似于 WinTitle 和 WinText, 除了 ExcludeTitle 不识别除窗口标题之外的任何条件.

窗口标题和文本是区分大小写的. 默认情况下, 不检测隐藏窗口, 而检测隐藏文本元素, 除非使用 DetectHiddenWindows 和 DetectHiddenText 进行更改; 当使用纯 HWND 时, 都会检测隐藏窗口. 默认情况下, 窗口标题的任意位置包含 WinTitle 或 ExcludeTitle 就能形成匹配, 除非使用 SetTitleMatchMode 进行了更改.

错误处理

如果找不到窗口, 则抛出 TargetError.

如果一个或多个 Options 无效, 或指定的坐标超过 2000 对, 则抛出 ValueError.

如果指定的区域无效或无法应用于目标窗口, 则抛出 OSError.

备注

当为脚本所拥有的窗口设置了一个区域时, 系统可能会自动改变渲染窗口框架的方法, 从而改变其外观. 其效果类似于下面所示的解决方法 #2, 但只影响窗口, 直到其区域被重置.

已知限制: 为不属于脚本的窗口设置一个区域可能会产生意想不到的结果, 如果该窗口有标题(标题栏), 并且系统启用了桌面合成. 这是因为可见的框架实际上并不是窗口的一部分, 而是由一个名为 "桌面窗口管理器(DWM)" 的单独系统进程渲染的. 注意, 在 Windows 8 及以后的版本中, 桌面合成始终处于启用状态. 可以使用以下两种解决方法之一:

; #1: 移除窗口标题.
WinSetStyle "-0xC00000", "Window Title"

; 恢复:
WinSetStyle "+0xC00000", "Window Title"
; #2: 禁用 DWM 渲染窗口的框架.
DllCall("dwmapi\DwmSetWindowAttribute", "ptr", WinExist("Window Title")
  , "uint", DWMWA_NCRENDERING_POLICY := 2, "int*", DWMNCRP_DISABLED := 1, "uint", 4)

; 恢复(这也可能导致任何设置的区域被忽略):
DllCall("dwmapi\DwmSetWindowAttribute", "ptr", WinExist("Window Title")
  , "uint", DWMWA_NCRENDERING_POLICY := 2, "int*", DWMNCRP_ENABLED := 2, "uint", 4)

窗口函数, 控件函数

示例

使记事本在此矩形之外的所有部分都不可见. 这个例子可能不适用于 Windows 11 或更高版本的新记事本.

WinSetRegion "50-0 w200 h250", "ahk_class Notepad"

与上面相同, 不过带有 40x40 的圆角. 这个例子可能不适用于 Windows 11 或更高版本的新记事本.

WinSetRegion "50-0 w200 h250 r40-40", "ahk_class Notepad"

创建椭圆形窗口.

WinSetRegion "50-0 w200 h250 E", "ahk_class Notepad"

创建倒三角形窗口. 这个例子可能不适用于 Windows 11 或更高版本的新记事本.

WinSetRegion "50-0 250-0 150-250", "ahk_class Notepad"

将窗口恢复原来/默认的形状. 这个例子可能不适用于 Windows 11 或更高版本的新记事本.

WinSetRegion , "ahk_class Notepad"

它在记事本(或任何其他窗口) 内创建一个透明的矩形孔. 下面指定了两个矩形: 一个外部的, 一个内部的. 每个矩形由 5 对 X/Y 坐标组成, 因为第一对是用来 "闭合" 每个矩形的重复坐标. 这个例子可能不适用于 Windows 11 或更高版本的新记事本.

WinSetRegion "0-0 300-0 300-300 0-300 0-0   100-100 200-100 200-200 100-200 100-100", "ahk_class Notepad"