# WinSet

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

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

## 参数

SubCommand, Value
  他们互相依赖, 其用法描述如下.
WinTitle
  窗口标题或识别目标窗口的其他条件. 请参阅 WinTitle.
WinText
  如果使用此参数, 那么它必须是目标窗口中单个文本元素的子字符串(和内置的 Window Spy 工具显示的一样). 当 DetectHiddenText 设置为 ON 时, 那么会检测到隐藏文本元素.
ExcludeTitle
  标题中含有此参数值的窗口将被排除.
ExcludeText
  文本中含有此参数值的窗口将被排除.

## 子命令

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

- AlwaysOnTop: 让窗口处于置顶状态.
- Bottom: 发送窗口到堆栈的底部; 即在所有其他窗口的下面.
- Top: 把窗口带回到堆栈的顶部而不进行激活.
- Disable: 禁用窗口.
- Enable: 启用窗口.
- Redraw: 重绘窗口.
- Style: 改变窗口的样式.
- ExStyle: 改变窗口的扩展样式.
- Region: 改变窗口的形状为指定的矩形, 椭圆形或多边形.
- Transparent: 设置窗口为半透明状态.
- TransColor: 让目标窗口中指定颜色的所有像素透明.

### 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

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

### Disable

禁用窗口.

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

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

### Enable

启用窗口.

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

### Redraw

重绘窗口.

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

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

### Style

改变窗口的样式.

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

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

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

改变可见窗口的某些样式后, 可能需要使用上面的 Redraw 子命令对窗口进行重绘. 最后, 样式表中列出了一些常用的样式编号. 例如:

    WinSet, Style, -0xC00000, A  ; 移除活动窗口的标题栏(WS_CAPTION).

### ExStyle

改变窗口的扩展样式.

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

有关细节, 请参阅 Style 子命令. 例如:

    WinSet, ExStyle, ^0x80, WinTitle ; 切换 WS_EX_TOOLWINDOW 属性, 它会移除/添加窗口到 alt-tab 列表.

### Region

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

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

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

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

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

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

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

R[w-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, 但只影响窗口, 直到其区域被重置.

已知限制: 为不属于脚本的窗口设置一个区域可能会产生意想不到的结果, 如果该窗口有标题(标题栏), 并且系统启用了桌面合成. 这是因为可见的框架实际上并不是窗口的一部分, 而是由一个名为 "桌面窗口管理器" 的单独系统进程渲染的. 注意, 在 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 和 255 之间的数字来表示透明度: 0 表示完全透明, 255 表示完全不透明.

指定单词 `Off` 可以完全关闭窗口的透明度. 这在功能上与 `WinSet, TransColor, Off, WinTitle` 相同. 指定 `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, WinTitle`.

单词 `Off` 可以完全关闭窗口的透明度. 这与 `WinSet, Transparent, Off, WinTitle` 功能完全相同. 指定 `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

窗口标题和文本是区分大小写的. 只有在 DetectHiddenWindows 打开时, 才能检测到隐藏窗口.

## 相关

WinGet, WinHide, WinSetTitle, WinMove, WinActivate, Control

## 示例

让记事本变得有点透明.

    WinSet, Transparent, 200, Untitled - Notepad

让白色部分透明.

    WinSet, TransColor, White, Untitled - Notepad

切换计算器的置顶状态.

    WinSet, AlwaysOnTop, Toggle, Calculator

演示子命令 Transparent 和 TransColor 的效果. 注意: 如果在鼠标光标悬停在 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 子命令的用法:

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

    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

dftg