# SysGet

获取屏幕分辨率、多监视器信息、系统对象的尺寸以及其他系统属性。

SysGet, OutputVar, Sub-command [, Param3]

#### 参数

OutputVar | 用于存放结果的变量名。
Sub-command | 参见下表。
Param3 | 除非在下面有注明，否则省略该参数。

#### Sub-commands

MonitorCount: 获取监视器的总数。与下表提到的 SM_CMONITORS 不同，MonitorCount 包括所有的监视器，甚至是那些没有被用作桌面一部分的监视器。在 Windows 95/NT 中该数总是为 1 。

MonitorPrimary: 获取主监视器的数量，单监视器系统中该值为 1 。在 Windows 95/NT 中主监视器总是为 1 。

Monitor [, N] : 获取监视器 N (如果 N 省略，将使用主监视器)的边界坐标。此信息将被存储于以 OutputVar 开头的 4 个变量内。如果 N 太高或接收信息时有问题，所有变量将被置空。举个例子：
SysGet, Mon2, Monitor, 2
MsgBox, 左: %Mon2Left% -- 上: %Mon2Top% -- 右: %Mon2Right% -- 下 %Mon2Bottom%.

在一个 函数 中，要创建一组全局而非局部的变量，则在使用此命令前先将 Mon2 声明为全局变量。(相反在 assume-global 函数中同样如此)。

MonitorWorkArea [, N]: 同上，不过该区域不包括任务栏及其他已注册的桌面工具栏。

MonitorName [, N]: 监视器 N(如果 N 省略，将使用主监视器)的操作系统名称。

(数值): 指定 Sub-command 为下表中的一个数来接收相应的值。以下的例子会将鼠标按钮数储存到名为 "MouseButtonCount" 的变量里：
SysGet, MouseButtonCount, 43

# 常用的

数值 | 说明
--- | ---
80 | SM_CMONITORS: 桌面上的监视器个数(不包括 "non-display pseudo-monitors(不显示的伪监视器)")。Windows 95/NT: 接收到的值总是 0 。
43 | SM_CMOUSEBUTTONS: 鼠标按钮数(未安装鼠标则为 0 )。
16, 17 | SM_CXFULLSCREEN, SM_CYFULLSCREEN: 主监视器上全屏窗口的客户区长宽，以像素为单位。
61, 62 | SM_CXMAXIMIZED, SM_CYMAXIMIZED: 主监视器上已最大化的顶层窗口的默认尺寸，以像素为单位。
59, 60 | SM_CXMAXTRACK, SM_CYMAXTRACK: 具有标题栏和边框的窗口的默认最大尺寸，以像素为单位。 相当于整个桌面的尺寸。用户拖动一个窗口的边框不可超出这个尺寸。
28, 29 | SM_CXMIN, SM_CYMIN: 一个窗口的最小宽高，以像素为单位。
57, 58 | SM_CXMINIMIZED, SM_CYMINIMIZED: 已最小化窗口的尺寸，以像素为单位。
34, 35 | SM_CXMINTRACK, SM_CYMINTRACK: 一个窗口的最小跟踪宽度，以像素为单位。用户拖动一个窗口的边框不可小于这个尺寸。 一个窗口可以通过处理 WM_GETMINMAXINFO 消息来覆盖这些值。
0, 1 | SM_CXSCREEN, SM_CYSCREEN: 主监视器屏幕的宽高，以像素为单位。这些值与内置变量 A_ScreenWidth 和 A_ScreenHeight 相同。
78, 79 | SM_CXVIRTUALSCREEN, SM_CYVIRTUALSCREEN: 虚拟屏幕的宽高，以像素为单位。虚拟屏幕是所有显示器的边界矩形。 SM_XVIRTUALSCREEN, SM_YVIRTUALSCREEN 这两个度量值是虚拟屏幕的左上角坐标。 Windows NT, Windows 95: 接收到的值总是 0 。
19 | SM_MOUSEPRESENT: 鼠标已安装则该值非零，否则为零。
75 | SM_MOUSEWHEELPRESENT: 带滚轮的鼠标已安装则该值非零，否则为零。Windows 95: 接收到的值总是 0 。
63 | SM_NETWORK: 如果提供网络支持，最低有效位被设置；否则，该位被清零。其他位被保留 以备将来使用。
8193 | SM_REMOTECONTROL: 该系统度量值用于 Terminal Services(终端服务) 环境。若当前会话被远程控制，该值非零； 否则为零。Windows 2000/NT, Windows Me/98/95: 接收到的值总是 0 。
4096 | SM_REMOTESESSION: 该系统度量值用于 Terminal Services(终端服务) 环境。若调用线程与一个终端服务的客户会话相关联，返回值非零； 若调用线程与终端服务的控制台会话相关联，返回值为零； 控制台会话未必是物理上的控制台。 Windows NT 4.0 SP3 及更早版本, Windows Me/98/95: 接收到的值总是 0 。
70 | SM_SHOWSOUNDS: 如果用户要求一个应用程序在原本只会提供声音信息的场合下同时提供可视化信息，该值非零；否则为零。
8192 | SM_SHUTTINGDOWN: 若当前会话正在关闭，该值非零；否则为零。Windows 2000/NT, Windows Me/98/95: 接收到的值总是 0 。
23 | SM_SWAPBUTTON: 如果鼠标左右键的意义被交换，该值非零；否则为零。
76, 77 | SM_XVIRTUALSCREEN, SM_YVIRTUALSCREEN: 虚拟屏幕的左上角坐标。虚拟屏幕是所有显示器的边界矩形。 相比之下， SM_CXVIRTUALSCREEN, SM_CYVIRTUALSCREEN 度量值(在上面，离这儿好几行)是虚拟屏幕的长和宽。Windows NT, Windows 95: 接收到的值总是 0 。

#
不常用的

数值 | 说明
--- | ---
56 | SM_ARRANGE: 一系列标志，指定系统是如何排列最小化窗口的。要获得更多信息请参阅 MSDN 。
67 | SM_CLEANBOOT: 指定系统是如何启动的： 0 正常启动 1 失败-安全启动 2 失败-带网络的安全启动
5, 6 | SM_CXBORDER, SM_CYBORDER: 窗口边框的宽高，以像素为单位。对于有 3D 外观的窗口而言，该值与 SM_CXEDGE 相等。
13, 14 | SM_CXCURSOR, SM_CYCURSOR: 光标的宽高，以像素为单位。系统无法创建其他大小的光标。
36, 37 | SM_CXDOUBLECLK, SM_CYDOUBLECLK: 围绕一个双击序列中第一次点击位置的矩形的宽高，以像素为单位。第二次点击只有发生在这个矩形内才会被系统认为这两次点击是一次双击。(两次点击还必须发生在指定的时间内。)
68, 69 | SM_CXDRAG, SM_CYDRAG: 以一个拖拽点为中心的矩形的宽高，在拖拽操作开始之前允许鼠标指针在该矩形内作有限的移动。这些值均以像素为单位。这允许用户可以方便地点击和释放鼠标按钮而不会在无意中开始一个拖拽操作。
45, 46 | SM_CXEDGE, SM_CYEDGE: 3D 边框的尺寸，以像素为单位。这些是 SM_CXBORDER 和 SM_CYBORDER 针对 3D 的副本。
7, 8 | SM_CXFIXEDFRAME, SM_CYFIXEDFRAME (与 SM_CXDLGFRAME, SM_CYDLGFRAME 同义): 带标题栏却不能改变大小的窗口的边框厚度，以像素为单位。SM_CXFIXEDFRAME 是水平边界的高度，SM_CYFIXEDFRAME 是垂直边界的宽度。
83, 84 | SM_CXFOCUSBORDER, SM_CYFOCUSBORDER: 控件焦点矩形的左右边缘的宽度(以像素为单位)和上下边缘的高度。Windows 2000/NT, Windows Me/98/95: 接收到的值总是 0 。
21, 3 | SM_CXHSCROLL, SM_CYHSCROLL: 水平滚动条上的箭头位图的宽度，以像素为单位；和水平滚动条的高度，以像素为单位。
10 | SM_CXHTHUMB: 水平滚动条上滑块的宽度，以像素为单位。
11, 12 | SM_CXICON, SM_CYICON: 一个图标的默认宽高，以像素为单位。
38, 39 | SM_CXICONSPACING, SM_CYICONSPACING: 大图标视图中一个项目单元格的尺寸，以像素为单位。每当调整位置时每个项目都会对齐到该大小的矩形中，这些值总是大于等于 SM_CXICON 和 SM_CYICON 。
71, 72 | SM_CXMENUCHECK, SM_CYMENUCHECK: 默认的菜单复选标记位图的尺寸，以像素为单位。
54, 55 | SM_CXMENUSIZE, SM_CYMENUSIZE: 菜单栏按钮(例如在多文档界面中用到的子窗口的关闭按钮)的尺寸，以像素为单位。
47, 48 | SM_CXMINSPACING SM_CYMINSPACING: 最小化窗口的单元格的尺寸，以像素为单位。每当调整位置时每个项目都会对齐到该大小的矩形中，这些值总是大于等于 SM_CXMINIMIZED 和 SM_CYMINIMIZED。
30, 31 | SM_CXSIZE, SM_CYSIZE: 窗口标题文字或标题栏中按钮的宽高，以像素为单位。
32, 33 | SM_CXSIZEFRAME, SM_CYSIZEFRAME: 可调大小的窗口的边框厚度，以像素为单位。SM_CXSIZEFRAME 是水平边界的高度，SM_CYSIZEFRAME 是垂直边界的宽度。与 SM_CXFRAME 和 SM_CYFRAME 同义。
49, 50 | SM_CXSMICON, SM_CYSMICON: 小图标的建议尺寸，以像素为单位。小图标往往出现在窗口标题和小图标视图中。
52, 53 | SM_CXSMSIZE SM_CYSMSIZE: 小标题栏按钮的尺寸，以像素为单位。
2, 20 | SM_CXVSCROLL, SM_CYVSCROLL: 垂直滚动条的宽度，以像素为单位；和垂直滚动条上的箭头位图的高度，以像素为单位。
4 | SM_CYCAPTION: 标题栏区域的高度，以像素为单位。
18 | SM_CYKANJIWINDOW: 对于双字节字符集版本的系统，这是屏幕右下角 Kanji 窗口的高度，以像素为单位。
15 | SM_CYMENU: 单行菜单栏的高度，以像素为单位。
51 | SM_CYSMCAPTION: 小标题栏的高度，以像素为单位。
9 | SM_CYVTHUMB: 垂直滚动条上滑块的高度，以像素为单位。
42 | SM_DBCSENABLED: 如果 User32.dll 支持 DBCS，该值非零；否则为零。Windows Me/98/95: 如果安装了双字节字符集(DBCS)版本的 User.exe，该值非零；否则为零。
22 | SM_DEBUG: 如果安装了调试版本的 User.exe，该值非零；否则为零。
82 | SM_IMMENABLED: 如果 输入法管理器/输入法编辑器 功能已开启，该值非零；否则为零。Windows NT, Windows Me/98/95: 接收到的值总是 0 。 SM_IMMENABLED 指示系统是否准备在 Unicode 应用程序上使用基于 Unicode 的输入法。要确保一个 language-dependent(语言依赖) 的输入法可用，检查 SM_DBCSENABLED 与系统的 ANSI 代码页。否则 ANSI 到 Unicode 的转换可能无法正确执行，或者有些组件如字体或注册表设置可能不会被提供。
87 | SM_MEDIACENTER: 如果当前操作系统是 Windows XP, Media Center Edition(媒体中心版)，该值非零；否则为零。
40 | SM_MENUDROPALIGNMENT: 如果下拉菜单是与其对应的菜单栏项目靠右对齐的，该值非零；如果菜单是左对齐的，则为零。
74 | SM_MIDEASTENABLED: 如果系统开启了希伯来语和阿拉伯语的支持，该值非零；否则为零。
41 | SM_PENWINDOWS: 如果 Microsoft Windows for Pen Computing 扩展已安装，该值非零；否则为零。
44 | SM_SECURE: 如果提供安全支持，该值非零；否则为零。
81 | SM_SAMEDISPLAYFORMAT: 如果所有显示器拥有相同的颜色格式，该值非零；否则为零。注意两个显示器可以有相同的色深，但是不同的颜色格式。举个例子，红色、绿色、蓝色像素可能被分别用不同的位数进行编码，或者那些位可能位于一个像素颜色值中的不同地方。Windows NT, Windows 95: 接收到的值总是 0 。
73 | SM_SLOWMACHINE: 在 Windows NT/2000/XP 及以后版本，该值总是 0 。在 Windows 95/98/ME 下，只有计算机至少符合以下情况之一才不为 0 ：拥有一个 386 处理器、拥有少于 6M 的内存、拥有一块要求低速的显卡。
86 | SM_TABLETPC: 如果当前操作系统是 Windows XP Tablet PC edition(平板电脑版)，该值非零；否则为零。

#### 注意

内置变量 A_ScreenWidth 和 A_ScreenHeight 包含主监视器的尺寸，以像素为单位。

#### 相关命令

DllCall, WinGet

#### 示例

    ; 示例 #1:
    SysGet, MouseButtonCount, 43
    SysGet, VirtualScreenWidth, 78
    SysGet, VirtualScreenHeight, 79

    ; 示例 #2: 这是一个可用脚本，显示每一个监视器的信息：
    SysGet, MonitorCount, MonitorCount
    SysGet, MonitorPrimary, MonitorPrimary
    MsgBox, 监视器数量:`t%MonitorCount%`n主监视器:`t%MonitorPrimary%
    Loop, %MonitorCount%
    {
        SysGet, MonitorName, MonitorName, %A_Index%
        SysGet, Monitor, Monitor, %A_Index%
        SysGet, MonitorWorkArea, MonitorWorkArea, %A_Index%
        MsgBox, 监视器:`t#%A_Index%`n名称:`t%MonitorName%`n左:`t%MonitorLeft% (%MonitorWorkAreaLeft% 工作)`n上:`t%MonitorTop% (%MonitorWorkAreaTop% 工作)`n右:`t%MonitorRight% (%MonitorWorkAreaRight% 工作)`n下:`t%MonitorBottom% (%MonitorWorkAreaBottom% 工作)
    }