WinSet

对指定的窗口进行各种设置, 例如 "总在最前面" 和透明度.

WinSet, SubCommand, Value , WinTitle, WinText, ExcludeTitle, ExcludeText

参数

SubCommand, Value
他们互相依赖, 其用法描述如下.
WinTitle, WinText, ExcludeTitle, ExcludeText

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

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

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

子命令

对于 SubCommand, 指定以下命令之一:

AlwaysOnTop

让窗口处于置顶状态.

WinSet, AlwaysOnTop , OnOffToggle, WinTitle, WinText, ExcludeTitle, ExcludeText

对于 OnOffToggle, 指定 On 打开此设置, Off 关闭, 而 Toggle 切换到当前的相反状态. 如果 OnOffToggle 是为空或省略, 默认为 Toggle. 单词 Topmost 可以代替 AlwaysOnTop.

[v1.1.30+]: 值 1(或 true), 0(或 false) 和 -1 可以分别用来代替 On, Off 和 Toggle.

Bottom

发送窗口到堆栈的底部; 即在所有其他窗口的下面.

WinSet, Bottom ,, WinTitle, WinText, ExcludeTitle, ExcludeText

这个效果类似于按下 Alt+Esc.

Top

把窗口带回到堆栈的顶部而不进行激活.

WinSet, Top ,, WinTitle, WinText, ExcludeTitle, ExcludeText

但是, 在大多数情况下系统默认设置会激活它. 此外, 当操作系统阻止应用程序从用户抢夺焦点时, 此命令可能没有效果(这可能取决于当前活动窗口的类型和用户当前正在进行的操作这些因素). 一个可能的解决方法是让窗口暂时窗口置顶, 然后关闭窗口置顶.

Disable

禁用窗口.

WinSet, Disable ,, WinTitle, WinText, ExcludeTitle, ExcludeText

当窗口被禁用时, 用户不能移动它或与它的控件进行交互. 此外, 被禁用的窗口会从 alt-tab 列表中移除.

Enable

启用窗口.

WinSet, Enable ,, WinTitle, WinText, ExcludeTitle, ExcludeText

Redraw

重绘窗口.

WinSet, Redraw ,, WinTitle, WinText, ExcludeTitle, ExcludeText

此子命令尝试通过通知操作系统窗口的矩形需要重新绘制来更新窗口的外观/内容. 如果此方法对特殊的窗口无效, 那么尝试使用 WinMove. 如果仍然无效, 那么尝试 WinHideWinShow 一起.

Style

改变窗口的样式.

WinSet, Style, N , WinTitle, WinText, ExcludeTitle, ExcludeText

如果 N 的首个字符为加号或减号, 那么会分别的添加或移除 N 中的样式. 如果首个字符为脱字符(^), 那么 N 中的样式会被切换到相反的状态. 如果首个字符为数字, 则窗口样式会被完全覆盖为 N.

如果设置失败, 则 ErrorLevel 被置为 1, 成功则为 0. 没有找到目标窗口或无法应用此样式时会设置失败.

改变可见窗口的某些样式后, 可能需要使用上面的 Redraw 子命令对窗口进行重绘. 最后, 样式表中列出了一些常用的样式编号. 例如, 下面将移除窗口的窗口标题栏(WS_CAPTION): WinSet, Style, -0xC00000.

ExStyle

改变窗口的扩展样式.

WinSet, ExStyle, N , WinTitle, WinText, ExcludeTitle, ExcludeText

有关细节, 请参阅 Style 子命令. 例如, 下面将切换 WS_EX_TOOLWINDOW 属性, 它会移除/添加窗口到 alt-tab 列表: WinSet, ExStyle, ^0x80.

Region

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

WinSet, Region , Options, WinTitle, WinText, ExcludeTitle, ExcludeText

如果 Options 为空或省略, 那么恢复窗口为原来/默认的形状. 否则, 请指定一个或多个下列选项, 选项之间使用空格分隔:

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

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

X-Y: 这样的一对为 X/Y 坐标对. 例如, 200-0 表示 X 坐标为 200, Y 坐标为 0.

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

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

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

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

如果设置失败, 则 ErrorLevel 被置为 1, 成功则为 0. 出现以下情况时会设置失败: 1) 目标窗口不存在; 2) Options 有一个或多个选项无效; 3) 指定了超过 2000 对坐标; 4) 指定的形状是无效的或不适用于目标窗口.

请参阅页面底部的示例 #7, 了解如何去使用此子命令.

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

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

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

; 恢复:
WinSet Style, +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)

Transparent

设置窗口为半透明状态.

WinSet, Transparent , N, WinTitle, WinText, ExcludeTitle, ExcludeText

如果 N 为空或省略, 默认为 0. 否则, 请指定 N 为介于 0 和 255 之间的数字来表示透明度: 0 表示完全透明, 255 表示完全不透明.

指定 N 为单词 Off 可以完全关闭窗口的透明度. 这在功能上与 WinSet, TransColor, Off 相同. 指定 Off 与指定 255 的区别是, 这样可以提升性能并降低系统资源的占用.

例如, 要使任务栏透明, 请使用 WinSet, Transparent, 150, ahk_class Shell_TrayWnd. 类似地, 要使经典的开始菜单透明, 请参见示例 #5. 要使开始菜单的子菜单透明, 还需要包含示例 #6 中的脚本.

在使用 Off 之前, 将透明级别设置为 255, 可以避免窗口重绘问题, 比如黑色背景. 如果窗口仍无法正确重绘, 那么请参阅 Redraw 了解可能的解决方法.

[v1.1.24.05+]: 这个子命令也适用于缺少标题(标题栏) 并且缺少置顶属性的窗口.

TransColor

让目标窗口中指定颜色的所有像素透明.

WinSet, TransColor, Color , WinTitle, WinText, ExcludeTitle, ExcludeText

这样可以让它后面的窗口内容显示出来. 如果用户点击透明部分, 那么点击会 "穿透" 到此窗口的后面. 指定 Color 为颜色名称或 RGB 值(请参阅颜色图表进行了解或使用 PixelGetColor 的 RGB 模式). 此外, 要让目标窗口中符合指定颜色的部分半透明, 请在颜色参数后添加空格(不是逗号) 和透明度等级(0-255). 例如: WinSet, TransColor, EEAA99 150.

单词 Off 可以完全关闭窗口的透明度. 这与 WinSet, Transparent, Off 功能完全相同. 指定 Off 与指定 255 的区别是, 这样可以提升性能并降低系统资源的占用.

TransColor 常用来创建屏幕显示(OSD) 和其他视觉效果. 在 Gui 页面的底部有一个屏幕显示的例子.

在使用 Off 之前, 将透明级别设置为 255, 可以避免窗口重绘问题, 比如黑色背景. 如果窗口仍无法正确重绘, 那么请参阅 Redraw 了解可能的解决方法.

要改变窗口现有的 TransColor, 可能需要在改变前关闭透明度.

[v1.1.24.05+]: 这个子命令也适用于缺少标题(标题栏) 并且缺少置顶属性的窗口.

备注

除了上面明确指出的情况外, 此命令不会改变 ErrorLevel.

尽管 Windows 2000/XP 或更高版本中支持透明度, 但只有在 Windows XP 或更高版本中才能获取窗口的当前透明度设置(通过 WinGet).

脚本的 SplashText 窗口可以通过下面的命令使他不置顶:

WinSet, AlwaysOnTop, Off, My Splash Window Title

WinGet, WinHide, WinSetTitle, WinMove, WinActivate, Control

示例

让记事本变得有点透明.

WinSet, Transparent, 200, Untitled - Notepad

让白色部分透明. 这个例子可能不适用于 Windows 11 或更高版本的新记事本.

WinSet, TransColor, White, Untitled - Notepad

切换计算器的置顶状态.

WinSet, AlwaysOnTop, Toggle, Calculator

演示子命令 TransparentTransColor 的效果. 注意: 如果在鼠标光标悬停在 TransColor 造成的不可见的像素上时按下其中一个热键, 则这个像素下面可见的窗口将会被替代! 此外, Win+G 只会对 Windows XP 或以后的系统上才有效果, 因为 Windows 2000 不支持获取透明度设置.

#t::  ; 按下 Win+T 来让鼠标光标下的颜色透明.
MouseGetPos, MouseX, MouseY, MouseWin
PixelGetColor, MouseRGB, %MouseX%, %MouseY%, RGB
; 似乎有必要首先关闭任何现有的透明度:
WinSet, TransColor, Off, ahk_id %MouseWin%
WinSet, TransColor, %MouseRGB% 220, ahk_id %MouseWin%
return

#o::  ; 按下 Win+O 来关闭鼠标下窗口的透明度.
MouseGetPos,,, MouseWin
WinSet, TransColor, Off, ahk_id %MouseWin%
return

#g::  ; 按下 Win+G 来显示鼠标下窗口的当前透明设置.
MouseGetPos,,, MouseWin
WinGet, Transparent, Transparent, ahk_id %MouseWin%
WinGet, TransColor, TransColor, ahk_id %MouseWin%
ToolTip Translucency:`t%Transparent%`nTransColor:`t%TransColor%
return

使经典开始菜单透明(另外使开始菜单的子菜单透明, 请参阅示例 #6).

DetectHiddenWindows, On
WinSet, Transparent, 150, ahk_class BaseBar

要使整个系统上的所有或选定的菜单都透明, 请保持如下所示的脚本始终运行着. 请注意, 尽管这样的脚本不能使自己的菜单透明, 但它可以使其他脚本的菜单透明.

#Persistent
SetTimer, WatchForMenu, 5
return  ; 自动执行段结束.

WatchForMenu:
DetectHiddenWindows, On  ; 可以让检测菜单更早.
if WinExist("ahk_class #32768")
    WinSet, Transparent, 150  ; 使用上面一行找到的窗口.
return

Region 子命令的用法. 这些例子可能不适用于 Windows 11 或更高版本的新记事本.

隐藏记事本在这矩形之外的所有部分.

WinSet, Region, 50-0 w200 h250, ahk_class Notepad

与上面相同, 不过带有 40x40 的圆角.

WinSet, Region, 50-0 w200 h250 r40-40, ahk_class Notepad

创建椭圆形窗口.

WinSet, Region, 50-0 w200 h250 E, ahk_class Notepad

创建倒三角形窗口.

WinSet, Region, 50-0 250-0 150-250, ahk_class Notepad

将窗口恢复原来/默认的形状.

WinSet, Region,, ahk_class Notepad

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

WinSet, Region, 0-0 300-0 300-300 0-300 0-0   100-100 200-100 200-200 100-200 100-100, ahk_class Notepad