WinSetRegion

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

WinSetRegion Options, WinTitle, WinText, ExcludeTitle, ExcludeText

参数

Options

类型: 字符串

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

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

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

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

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

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 实用程序显示).

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

窗口标题和文本是区分大小写的. 默认情况下, 不检测隐藏窗口, 而检测隐藏文本元素, 除非使用 DetectHiddenWindowsDetectHiddenText 进行更改. 默认情况下, 窗口标题必须以指定的 WinTitleExcludeTitle 开头才能匹配, 除非使用 SetTitleMatchMode 进行更改.

错误处理

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

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

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

备注

鼠标光标下的窗口的 ID 可以使用 MouseGetPos 来获取.

当为脚本所拥有的窗口设置了一个区域时, 系统可能会自动改变渲染窗口框架的方法, 从而改变其外观. 其效果类似于下面所示的解决方法 #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"