# win 库模块帮助文档

## win 成员列表 <a id="win" href="#win">&#x23;</a>

### win._form <a id="win._form" href="#win._form">&#x23;</a>
常量对象,可用于替换表示原始 win.form 对象,  
并禁止用户修改其定义.

### win._parseMessage(MSG结构体) <a id="win._parseMessage" href="#win._parseMessage">&#x23;</a>
处理消息函数原始版本,慎用

### win.autoQuitMessage <a id="win.autoQuitMessage" href="#win.autoQuitMessage">&#x23;</a>
如果显式指定此属性值为 false ，  
则禁止当前线程在关闭最后一个非模态、非 MessageOnly 的独立窗口（ 或 mainForm 窗口 ）  
时自动调用 win.quitMessage 函数退出消息循环。

### win.center(窗口句柄,目标窗口句柄) <a id="win.center" href="#win.center">&#x23;</a>
目标窗口区域内居中，并调整以保证显示在父窗口或屏幕工作区内。  
参数 @1 指定目标窗口句柄，设为 0 表示桌面，  
省略目标窗口则默认取父窗口或所有者窗口。  

注意 win.form 创建的所有窗体与控件都支持 center 方法，  
控件的 center 方法会在调用 win.center 以后自动调用 saveScale，adjust 方法。  
窗口的 center 方法则会自动调用  
win.form 的构造参数中 left,top 的值为 -1 （默认值）时，  
创建的独立窗口默认就是屏幕居中显示，不必再多调用一次 center 函数。

### win.clearInterval(定时器ID) <a id="win.clearInterval" href="#win.clearInterval">&#x23;</a>
删除定时器。  
参数如果为 null 则忽略不执行，  
否则定时器 ID 必须是 win.setInterval 函数的返回值

### win.clearTimeout(定时器ID) <a id="win.clearTimeout" href="#win.clearTimeout">&#x23;</a>
删除定时器。  
参数如果为 null 则忽略不执行，  
否则定时器 ID 必须是 win.setTimeout 函数的返回值

### win.close(输入窗口句柄) <a id="win.close" href="#win.close">&#x23;</a>
关闭窗口  
关闭外部进程窗口请使用winex.close()替代

### win.delay() <a id="win.delay" href="#win.delay">&#x23;</a>
在界面线程中延时并同时处理窗口消息，  
如果程序退出返回 null,否则返回 true。  

可选参数 @1 指定延时值（单位毫秒），默认值为 0。  
即使无参数或参数 @1 为 0，此函数仍然会至少执行一次消息检查。  
如果不需要消息循环时（例如控制台程序），可使用 sleep 函数延时。  
也可以改用自动调用合适延时函数的 thread.delay 函数：  
thread.delay 在导入 win 或 win.ui 库的线程指向 win.delay，否则指向 sleep 函数。  

如果用于耗时循环中响应用户操作,  
建议使用速度更快的 win.peekPumpMessage 或 win.peekPumpInputMessage

### win.eachChild(父窗口句柄,窗口类名) <a id="win.eachChild" href="#win.eachChild">&#x23;</a>

```aardio
for hwnd in win.eachChild(/*按Z序遍历所有子窗口,  
省略父窗口句柄遍历桌面顶层窗口,  
窗口类名是可选参数，支持模式匹配语法  

此函数忽略UWP应用窗口,  
如果需要包含 UWP 窗口请改用 winex.eachFindEx 函数*/) {

}
```

### win.enable(输入窗口句柄,false) <a id="win.enable" href="#win.enable">&#x23;</a>
禁用窗口

### win.enable(输入窗口句柄,true) <a id="win.enable" href="#win.enable">&#x23;</a>
启用窗口

### win.enum(callback) <a id="win.enum" href="#win.enum">&#x23;</a>

```aardio
win.enum(  
	function(hwnd){  
		return true; /*枚举所有桌面顶层窗口,并回调此函数,  
忽略UWP窗口,如果需要包含UWP窗口请改用 winex.enum 函数*/  
	}  
)
```

### win.enumThread(callback,threadId) <a id="win.enumThread" href="#win.enumThread">&#x23;</a>

```aardio
win.enum(  
	function(hwnd){  
		return true; /*枚举指定线程顶层窗口,并回调此函数。  
可选用参数 @2 指定线程 ID，默认为当前线程 ID。  
忽略 UWP 窗口,如果需要包含 UWP 窗口请改用 winex.enum 函数*/  
	}  
)
```

### win.find(类名,标题) <a id="win.find" href="#win.find">&#x23;</a>
查找顶层窗口,参数都是可选参数

### win.findEx(父窗口句柄,上一个窗口句柄,类名,标题) <a id="win.findEx" href="#win.findEx">&#x23;</a>
查找子窗口  
除父窗口句柄以外,其他参数都是可选参数,  
类名和标题不支持模式匹配,  
如果需要支持模式匹配,请改用 winex.findEx 或 winex.findEx2

### win.flash(句柄,次数,时间间隔,选项) <a id="win.flash" href="#win.flash">&#x23;</a>
闪烁窗口

### win.getActive() <a id="win.getActive" href="#win.getActive">&#x23;</a>
获取当前线程激活窗口句柄,如果要获取全局激活窗口请使用win.getForeground()

### win.getAncestor <a id="win.getAncestor" href="#win.getAncestor">&#x23;</a>
获取上层父窗口

### win.getAncestor(hwnd, _GA_PARENT ) <a id="win.getAncestor" href="#win.getAncestor">&#x23;</a>
返回父窗口,  
与getParent函数相比主要有三个区别  
1、不会返回所有者窗口  
2、不考虑窗口样式是不是有WS_CHILD  
3、顶层窗口返回桌面窗口句柄而不是0

### win.getAncestor(hwnd, _GA_ROOT ) <a id="win.getAncestor" href="#win.getAncestor">&#x23;</a>
返回最上层父窗口,不包含桌面窗口  
此函数与getRoot函数返回值相同

### win.getChild(输入窗口句柄) <a id="win.getChild" href="#win.getChild">&#x23;</a>
获取子窗口句柄

### win.getClass(输入窗口句柄) <a id="win.getClass" href="#win.getClass">&#x23;</a>
获取窗口类名

### win.getClassLong( hwnd,_GCL ) <a id="win.getClassLong" href="#win.getClassLong">&#x23;</a>
返回窗体WNDCLASSEX结构的32位值

### win.getClassPointer( hwnd,_GCL ) <a id="win.getClassPointer" href="#win.getClassPointer">&#x23;</a>
返回窗体WNDCLASSEX结构的句柄值

### win.getClientPos(输入窗口句柄) <a id="win.getClientPos" href="#win.getClientPos">&#x23;</a>
返回客户区相对窗口的坐标 x,y,宽,高

### win.getClientRect() <a id="win.getClientRect" href="#win.getClientRect">&#x23;</a>
[返回对象:rectObject](https://www.aardio.com/zh-cn/docs/library-reference/global/_.html#rectObject)

### win.getClientRect(输入窗口句柄) <a id="win.getClientRect" href="#win.getClientRect">&#x23;</a>
获取窗口客户区的坐标位置矩形区块，不包括边框。  
返回值为 ::RECT 结构体

### win.getCopyData(lParam) <a id="win.getCopyData" href="#win.getCopyData">&#x23;</a>
获取 _WM_COPYDATA 消息发送的数据  
lParam 为窗口消息回调 wndproc 函数的回调参数  

此函数有2个返回值,分别为接收到的字符串值、表示数据类型的数值

### win.getCursorPos() <a id="win.getCursorPos" href="#win.getCursorPos">&#x23;</a>
返回当前鼠标所在位置的x,y坐标,  
返回值有两个

### win.getDesktop() <a id="win.getDesktop" href="#win.getDesktop">&#x23;</a>
获取桌面句柄

### win.getDropFile(wParam) <a id="win.getDropFile" href="#win.getDropFile">&#x23;</a>
用于消息回调函数中获取拖放文件列表  

以管理权限启动的进程操作系统会禁止拖放操作，  
标准库提供了 process.admin.enableDropMsg 函数可以设置这个权限，  
但现在这个设置有可能也是不被允许的

### win.getFocus() <a id="win.getFocus" href="#win.getFocus">&#x23;</a>
获取输入焦点所在窗口句柄

### win.getForeground() <a id="win.getForeground" href="#win.getForeground">&#x23;</a>
获取前台窗口句柄

### win.getFullscreen() <a id="win.getFullscreen" href="#win.getFullscreen">&#x23;</a>
返回当前全屏窗口

### win.getId(输入窗口句柄) <a id="win.getId" href="#win.getId">&#x23;</a>
获取控件ID

### win.getIdleTime() <a id="win.getIdleTime" href="#win.getIdleTime">&#x23;</a>
获取用户未进行任何操作的空闲时间  
单位毫秒，1000 毫秒为 1秒

### win.getLeaf(输入窗口句柄) <a id="win.getLeaf" href="#win.getLeaf">&#x23;</a>
窗口的最梢节子窗口(没有子窗口的控件窗口)

### win.getMessage(msg,窗口句柄,最小消息,最大消息,选项) <a id="win.getMessage" href="#win.getMessage">&#x23;</a>
检查并获取窗口消息。  
msg 参数可以是 MSG 结构体，也可以是一个空表用于接收新的 MSG 结构体，也可以省略  
成功返回已填充消息的 MSG 结构体（如果指定了msg参数则该参数就是此返回值),  
无消息返回 false，程序退出返回 null。  

所有参数都是可选参数。  
不指定「选项」参数则默认为 _PM_REMOVE 表示自消息队列移除获取到的消息。  
其他选项请参考同名 WINAPI的说明

### win.getMessagePos() <a id="win.getMessagePos" href="#win.getMessagePos">&#x23;</a>
返回鼠标的屏幕绝对坐标 x,y。  
此函数有两个返回值，返回值 x,y 都是数值。  
表示上一次获取的窗口消息时鼠标占用的坐标点

### win.getMessagePos(lParam) <a id="win.getMessagePos" href="#win.getMessagePos">&#x23;</a>
返回鼠标的窗口内相对坐标 x,y。  
此函数有两个返回值，返回值 x,y 都是数值。  
lParam必须是窗口回调函数中的lParam参数

### win.getMonitorInfo <a id="win.getMonitorInfo" href="#win.getMonitorInfo">&#x23;</a>
获取窗口所在显示器信息  
sys.monitor 提供更多与显示器有关的函数

### win.getMonitorInfo() <a id="win.getMonitorInfo" href="#win.getMonitorInfo">&#x23;</a>
[返回对象:MONITORINFOObject](#MONITORINFOObject)

### win.getMonitorInfo(坐标,选项) <a id="win.getMonitorInfo" href="#win.getMonitorInfo">&#x23;</a>
获取指定坐标所在的显示器信息  
参数@1可指定 ::POINT 结构体，或包含 x,y 成员的表,\选项默认为 _MONITOR_DEFAULTTONEAREST,即获取最靠近的显示器

### win.getMonitorInfo(窗口句柄,选项) <a id="win.getMonitorInfo" href="#win.getMonitorInfo">&#x23;</a>
获取窗口所在显示器信息,所有参数可选,\选项默认为 _MONITOR_DEFAULTTONEAREST,即获取最靠近的显示器

### win.getOwner(输入窗口句柄) <a id="win.getOwner" href="#win.getOwner">&#x23;</a>
获取所有者窗口句柄  
注意子窗口没有所有者窗口  

从属窗口总是显示在所有者窗口前面  
例如模态对话框通常会指定一个所有者窗口

### win.getParent(输入窗口句柄) <a id="win.getParent" href="#win.getParent">&#x23;</a>
返回父窗口  
父窗口为桌面且自身不是具有WS_CHELD样式的子窗口返回0  
该函数返回值为0表示窗口是一个顶层独立窗口[TopLevelWindow]  
注意WINAPI中的GetParent函数在aardio中被命名为win.getParentOwner

### win.getParentOwner(输入窗口句柄) <a id="win.getParentOwner" href="#win.getParentOwner">&#x23;</a>
拥有WS_CHILD样式的子窗口返回其父窗口  
拥有WS_POPUP样式的弹出对话框返回无WS_POPUP样式所有者窗口  
三种情况下该函数失败返回0  
1、如果有父窗口但是自身没有WS_CHILD样式返回0,  
2、有所有者窗口但自身没有WS_POPUP样式也返回0  
3、所有者窗口具有WS_POPUP也返回0  
此函数为WINAPI中的GetParent函数,原名字有误导性在aardio中已改名

### win.getPlacement() <a id="win.getPlacement" href="#win.getPlacement">&#x23;</a>
[返回对象:WINDOWPLACEMENTObject](#WINDOWPLACEMENTObject)

### win.getPlacement(输入窗口句柄) <a id="win.getPlacement" href="#win.getPlacement">&#x23;</a>
可省略参数  
返回WINDOWPLACEMENT结构体  
包含窗口最大化、最小化、还原状态的位置信息

### win.getPos(输入窗口句柄) <a id="win.getPos" href="#win.getPos">&#x23;</a>
返回相对坐标 x,y,宽,高

### win.getPos(输入窗口句柄,true) <a id="win.getPos" href="#win.getPos">&#x23;</a>
返回屏幕坐标 x,y,宽,高

### win.getRect(输入窗口句柄) <a id="win.getRect" href="#win.getRect">&#x23;</a>
返回窗体相对坐标位置矩形区块  
对于顶层窗口则等同于屏幕绝对坐标位置矩形区块

### win.getRect(输入窗口句柄,true) <a id="win.getRect" href="#win.getRect">&#x23;</a>
返回窗体屏幕坐标位置矩形区块  
返回值为 ::RECT 结构体

### win.getRoot(输入窗口句柄) <a id="win.getRoot" href="#win.getRoot">&#x23;</a>
获取顶层父窗口句柄  
没有上层父窗口该函数返回自身句柄

### win.getRootOwner(输入窗口句柄) <a id="win.getRootOwner" href="#win.getRootOwner">&#x23;</a>
获取顶层父窗口句柄或所有者窗口  
没有上层父窗口或所者者该函数返回自身句柄

### win.getScreen() <a id="win.getScreen" href="#win.getScreen">&#x23;</a>
返回主屏幕宽度、高度，  
win.getScreenPos 函数可获取所有显示器组成的虚拟屏幕位置与大小

### win.getScreenPos <a id="win.getScreenPos" href="#win.getScreenPos">&#x23;</a>
获取指定屏幕或所有屏幕位置与大小

### win.getScreenPos() <a id="win.getScreenPos" href="#win.getScreenPos">&#x23;</a>
返回所有显示器组成的虚拟屏幕位置与大小  
此函数返回多个值，分别为：x坐标，y坐标，宽，高。  
因为多个显示器的可能设置不同的排序，屏幕起始坐标并不总是 0,0，  
注意单个显示器仍然可以使用此函数获取

### win.getScreenPos(坐标,选项) <a id="win.getScreenPos" href="#win.getScreenPos">&#x23;</a>
获取指定坐标所在的显示器在屏幕位置与大小，  
此函数返回多个值，分别为：x坐标，y坐标，宽，高。  
参数@1可指定 ::POINT 结构体，或包含 x,y 成员的表,  
参数 @2 默认为 _MONITOR_DEFAULTTONEAREST,即获取最靠近的显示器，  
如果失败则返回所有显示器组成的虚拟屏幕位置与大小

### win.getScreenPos(窗口句柄,选项) <a id="win.getScreenPos" href="#win.getScreenPos">&#x23;</a>
获取窗口所在屏幕位置与大小，  
此函数返回多个值，分别为：x坐标，y坐标，宽，高。  
参数 @2 默认为 _MONITOR_DEFAULTTONEAREST,即获取最靠近的显示器，  
如果失败则返回所有显示器组成的虚拟屏幕位置与大小

### win.getStyle(窗口句柄,限定样式,不允许包含的样式) <a id="win.getStyle" href="#win.getStyle">&#x23;</a>
获取指定窗口样式,除句柄外其他参数可选

### win.getStyleEx(窗口句柄,限定样式,不允许包含的样式) <a id="win.getStyleEx" href="#win.getStyleEx">&#x23;</a>
获取窗口扩展样式,除句柄外其他参数可选

### win.getText <a id="win.getText" href="#win.getText">&#x23;</a>
获取窗口文本。  

如果目标窗口属于外部进程并可能失去响应导致此函数阻塞,  
请改用winex.getText函数获取窗口文本

### win.getText(hwnd,length,startIndex) <a id="win.getText" href="#win.getText">&#x23;</a>

```aardio
获取窗口文本  
- 参数 @hwnd 指定窗口句柄  
- 可选参数 @length 指定获取的最大字符数（按 UTF-16 编码计数）  
- 可选参数 @startIndex 指定起始位置，按字符计数（按 UTF-16 编码计数）  
注意此函数并非按 aardio 默认的 UTF-8 编码规则将多字节字符总是计为 1 个单位，  
而是按 UTF-16 编码规则将需要用代理对编码的字符计为 2 个单位。
```

### win.getTextById(hwnd,id,len=256) <a id="win.getTextById" href="#win.getTextById">&#x23;</a>
获取窗口上控件的文本  
参数(窗口句柄,控件ID,缓冲区大小)

### win.getThreadProcessId(输入窗口句柄) <a id="win.getThreadProcessId" href="#win.getThreadProcessId">&#x23;</a>
返回线程ID,进程ID  
var tid,pid=win.getThreadProcessId(hwnd)

### win.getWindow( hwnd, _GW ) <a id="win.getWindow" href="#win.getWindow">&#x23;</a>
获取相关窗口

### win.getWorkArea <a id="win.getWorkArea" href="#win.getWorkArea">&#x23;</a>
返回屏幕上窗口最大化时可使用的显示区块。  
返回值为 ::RECT 结构体  

[返回对象:rectObject](https://www.aardio.com/zh-cn/docs/library-reference/global/_.html#rectObject)

### win.getWorkArea() <a id="win.getWorkArea" href="#win.getWorkArea">&#x23;</a>
[返回对象:rectObject](https://www.aardio.com/zh-cn/docs/library-reference/global/_.html#rectObject)

### win.getWorkArea(坐标,选项) <a id="win.getWorkArea" href="#win.getWorkArea">&#x23;</a>
返回屏幕上窗口最大化时可使用的显示区块  
参数@1可指定 ::POINT 结构体，或包含 x,y 成员的表,  
省略参数@1 则自动获取鼠标当前坐标作为参数。  
选项默认为 _MONITOR_DEFAULTTONEAREST,即获取最靠近的显示器

### win.getWorkArea(窗口句柄,选项) <a id="win.getWorkArea" href="#win.getWorkArea">&#x23;</a>
返回屏幕上窗口最大化时可使用的显示区块,所有参数可选,  
选项默认为 _MONITOR_DEFAULTTONEAREST,即获取最靠近的显示器

### win.hitBorder <a id="win.hitBorder" href="#win.hitBorder">&#x23;</a>
用法同ptInBorder函数,  
但返回值转换为_WM_NCHITTEST消息返回值

### win.hitBorder(RECT矩形,x坐标,y坐标,上,右,下,左) <a id="win.hitBorder" href="#win.hitBorder">&#x23;</a>
可以使用一个参数指定四周边框宽度

### win.hookMessage(消息钩子函数) <a id="win.hookMessage" href="#win.hookMessage">&#x23;</a>

```aardio
win.hookMessage(   
	function(msg){  

	}   
)
```

### win.hookMessage(消息钩子函数,false) <a id="win.hookMessage" href="#win.hookMessage">&#x23;</a>
移除消息钩子函数  
消息钩子在分发窗口消息以前触发  
可返回值以阻止消息处理

### win.invoke(func,...) <a id="win.invoke" href="#win.invoke">&#x23;</a>

```aardio
thread.invokeAndWait(  
	function(){  
		import win;  
		/*创建工作线程执行参数 @1 指定的线程函数,  
参数@1之后的其他可选参数会作为调用线程函数的参数。  
调用并等待线程函数执行完毕,然后获取此线程函数的返回值,  
在界面线程等待时界面仍可响应用户操作，线程函数的返回值会返回给调用线程,  
线程函数拥有独立的全局变量，并应遵守多线程调用规则*/  
	}   
)
```

### win.isChild(父窗口句柄,子窗口句柄) <a id="win.isChild" href="#win.isChild">&#x23;</a>
判断参数二指定的窗口是否参数一指定窗口的子窗口或间接子窗口  
任何一个参数为null或0返回false

### win.isClosed() <a id="win.isClosed" href="#win.isClosed">&#x23;</a>
用户是否关闭了全部窗口

### win.isDialogMessage(hwnd,msg) <a id="win.isDialogMessage" href="#win.isDialogMessage">&#x23;</a>
处理对话框控制键消息

### win.isEnable(输入窗口句柄) <a id="win.isEnable" href="#win.isEnable">&#x23;</a>
判断窗口是否启用状态

### win.isIconic(输入窗口句柄) <a id="win.isIconic" href="#win.isIconic">&#x23;</a>
判断窗口是否最小化为任务栏图标。  
如果参数可能为子窗口句柄，应调用 win.getRoot 函数先转换为顶层窗口。  
注意：对最小化窗口获取 ::RECT 或坐标时会包含类似 -32000 这种超大的伪坐标。

### win.isVisible(输入窗口句柄) <a id="win.isVisible" href="#win.isVisible">&#x23;</a>
判断窗口是否可见。  
如果上级父窗口不可见，则此函数仍然会返回 false。  
如果要检查子窗口本身的可见样式，  
可用 win.getStyle 函数检查是否设置 _WS_VISIBLE 样式。  
如果是 aardio 创建的窗口对象，通过 hide 属性可检查是否设置 _WS_VISIBLE 样式。   

此函数不会检查伪装为可见的窗口隐形状态（Cloaked）,  
winex.isVisible 支持检测隐形状态

### win.isWindow(输入窗口句柄) <a id="win.isWindow" href="#win.isWindow">&#x23;</a>
判断是否有效窗口  
注意 aardio 创建的窗体或控件请使用 valid 属性判断，  
aardio 创建的所有控件都有 valid 属性（不一定会出现在提示中）

### win.isZoomed(输入窗口句柄) <a id="win.isZoomed" href="#win.isZoomed">&#x23;</a>
判断窗口是否最大化

### win.loadForm <a id="win.loadForm" href="#win.loadForm">&#x23;</a>
加载窗体代码文件

### win.loadForm() <a id="win.loadForm" href="#win.loadForm">&#x23;</a>
[返回对象:winform](https://www.aardio.com/zh-cn/docs/library-reference/win/ui/_.html#winform)

### win.loadForm(创建窗体参数,构造函数,父窗体,args...) <a id="win.loadForm" href="#win.loadForm">&#x23;</a>
加载窗体代码文件。  
- 参数 @1 为可指定创建窗体的函数、代码或者代码文件路径，  
aardio 工程内的代码文件路径必须以单个斜杠或反斜杠开始。  
- 参数 @2 为选参数,可用于临时替换 win.form 构造函数。  
- 可选添加不定个数调用参数，在被加载的窗体内使用 `...` 操作符接收不定个数参数。  
注意`...` 返回的的首个参数是父窗体，owner 参数也指向父窗体。  

返回创建窗体函数或代码的返回值。  
如果无返回值则返回调用过程中创建的首个 win.form 对象。

### win.loopMessage() <a id="win.loopMessage" href="#win.loopMessage">&#x23;</a>
如果当前消息循环未启动则启动消息循环,  
返回退出代码（可用于 return 语句退出当前线程并设置为线程返回值）  

此函数会启动界面线程的消息循环，循环处理并分发所有窗口消息，  
直到应用程序调用 win.quitMessage 才会退出。  

所有非模态、非 MessageOnly 的独立窗口（ 或 mainForm 窗口 ）都关闭后，  
将会自动终止 win.loopMessage 创建的消息循环（通常也就是退出界面线程）。  
因为关闭消息是异步处理，所以即使是在调用 win.loopMessage 前关闭窗口，  
仍然可能导致退出消息循环

### win.lowerRight(hwnd,x,y) <a id="win.lowerRight" href="#win.lowerRight">&#x23;</a>
移动窗口到右下角,  
可选使用x参数指定右边距,y参数指定下边距

### win.mapPoint <a id="win.mapPoint" href="#win.mapPoint">&#x23;</a>
转换窗口坐标

### win.mapPoint(源窗口句柄,目标窗口句柄,POINT对象) <a id="win.mapPoint" href="#win.mapPoint">&#x23;</a>
省略目标窗口句柄则默认设为桌面窗口（转换为屏幕坐标）

### win.mapRect <a id="win.mapRect" href="#win.mapRect">&#x23;</a>
转换窗口矩形

### win.mapRect(源窗口句柄,目标窗口句柄,RECT对象) <a id="win.mapRect" href="#win.mapRect">&#x23;</a>
省略的句柄默认以桌面句柄替代

### win.modifyStyle(hwnd,remove,add,swpFlags) <a id="win.modifyStyle" href="#win.modifyStyle">&#x23;</a>
修改窗口样式,所有参数都是可选参数,  
@hwnd 指定目标窗口句柄  
@remove 用数值指定要移除的样式,可使用 _WS_ 前缀的常量  
@add 用数值指定要添加的样式,可使用 _WS_ 前缀的常量  
@swpFlags 可选用数值指定调整窗口选项,可使用 _SWP_ 前缀的常量  
如果指定了 @swpFlag ,则使用该参数调用::SetWindowPos  
细节请参考函数源码

### win.modifyStyleEx(hwnd,remove,add,swpFlags) <a id="win.modifyStyleEx" href="#win.modifyStyleEx">&#x23;</a>
修改窗口扩展样式,所有参数都是可选参数,  
@hwnd 指定目标窗口句柄  
@remove 用数值指定要移除的样式,可使用 _WS_EX_ 前缀的常量  
@add 用数值指定要添加的样式,可使用 _WS_EX_ 前缀的常量  
@swpFlags 可选用数值指定调整窗口选项,可使用 _SWP_ 前缀的常量  
如果指定了 @swpFlag ,则使用该参数调用::SetWindowPos  
细节请参考函数源码

### win.msgbox <a id="win.msgbox" href="#win.msgbox">&#x23;</a>
弹出消息框。  
显示系统级别模态消息请改用 winex.msgbox 。

### win.msgbox("文本","标题",图标样式,所有者窗口句柄,显示时间) <a id="win.msgbox" href="#win.msgbox">&#x23;</a>
弹出消息框。  
除参数 @1 以外,所有参数可选。  
1. 如果参数 @1 是表对象则调用 table.tostring 序列化为文本。  
参数 @1 是其他类型调用 tostring 转为字符串。  
2. 可选用参数 @2 指定消息框标题。  
3. 可选参数 @3 可用字符串或数值指定图标样式（参考 _MB_ 前缀常量值，设为 0 去掉图标与提示音），也可以指定字符串值：  
    - "error","stop","hand" 错误图标  
    - "question" 询问图标，显示是、否、取消按钮  
    - 指定下其他样式名一律退化为默认样式。  
返回值为 `6/*_IDYES*/,7/*_IDNO*/, 2/*_IDCANCEL*/` 之一。  
    - "confirm","test" 询问图标，显示确定与取消按钮，返回值为 `1/*_IDOK*/,2/*_IDCANCEL*/` 之一。  
    - "warn" 警告图标  
    - "info" 信息图标。  
4. 可选用参数 @4 指定所有者窗口句柄   
5. 可选用参数 @5 限定显示时间，以毫秒为单位，超时自动关闭。  
注意所有窗口或控件都提供 msgbox 方法（不需要指定所有者窗口）。

### win.msgboxErr <a id="win.msgboxErr" href="#win.msgboxErr">&#x23;</a>
弹出错误消息框。  
注意所有窗口或控件都提供 msgbox 方法（不需要指定所有者窗口）。

### win.msgboxErr("文本","标题",所有者窗口句柄) <a id="win.msgboxErr" href="#win.msgboxErr">&#x23;</a>
弹出错误消息框。  
参数 @3 可选指定所有者窗口句柄。  
如果参数@1是表对象,自动调用 table.tostring 序列化为文本  
其他类型调用 tostring 转为字符串

### win.msgboxTest <a id="win.msgboxTest" href="#win.msgboxTest">&#x23;</a>
弹出确认消息框。  
注意所有窗口或控件都提供 msgbox 方法（不需要指定所有者窗口）。

### win.msgboxTest("文本","标题",所有者窗口句柄) <a id="win.msgboxTest" href="#win.msgboxTest">&#x23;</a>
弹出确认消息框，  
返回布尔值表示用户是否按了“确定”按钮。  
标题,所有者窗口参数可选   
如果参数@1是表对象,自动调用 table.tostring 序列化为文本  
其他类型调用 tostring 转为字符串

### win.msgboxTimeout("文本","标题",超时值,样式,所有者窗口句柄) <a id="win.msgboxTimeout" href="#win.msgboxTimeout">&#x23;</a>
弹出消息框，超时自动关闭。  
超时值以毫秒为单位(可选参数),  
除参数@1以外,其他所有参数可选。  
如果参数@1是表对象,自动调用 table.tostring 序列化为文本  
其他类型调用 tostring 转为字符串  

一般不必指定消息框样式，不必了解该参数用法

### win.parseMessage <a id="win.parseMessage" href="#win.parseMessage">&#x23;</a>

```aardio
win.parseMessage = win._parseMessage
```

### win.parseMessage_lite <a id="win.parseMessage_lite" href="#win.parseMessage_lite">&#x23;</a>

```aardio
win.parseMessage = messageTranslateDispatch;
```

### win.peekMessage(msg,窗口句柄,最小消息,最大消息,选项) <a id="win.peekMessage" href="#win.peekMessage">&#x23;</a>
等待并获取窗口消息。  
msg 参数可以是 MSG 结构体，也可以是一个空表用于接收新的 MSG 结构体，也可以省略。  
其余都是可选参数，用法与同名的 Windows API 函数相同。  
不指定「选项」参数则默认为 _PM_REMOVE 表示自消息队列移除获取到的消息。  
成功返回已填充消息的 MSG 结构体（如果指定了 msg 参数则该参数就是此返回值)。  
失败返回 false，程序退出返回 null。

### win.peekPumpInputMessage(msg) <a id="win.peekPumpInputMessage" href="#win.peekPumpInputMessage">&#x23;</a>
检测消息队列,如果有键盘鼠标、或绘图消息则处理消息并返回传入的消息对象。  
如果程序退出返回 null，如果无消息返回 false。  

可选使用参数@1指定 MSG 结构体或空表,重用同一 MSG 结构体,  

此函数如果没有检查到消息会直接返回而不是等待,  
可用于在耗时循环中避免界面不能响应用户操作

### win.peekPumpMessage(msg,窗口句柄,最小消息,最大消息,选项) <a id="win.peekPumpMessage" href="#win.peekPumpMessage">&#x23;</a>
检测消息队列，如果有消息则处理消息并返回传入的消息对象。  
如果程序退出返回 null ，如果无消息返回 false。  

所有参数可选,参数用法请参考win.peekMessage  
可选使用参数@1指定 MSG 结构体或空表,重用同一 MSG 结构体,  

此函数如果没有检查到消息会直接返回而不是等待,  
可用于在耗时循环中避免界面不能响应用户操作

### win.ptInBorder <a id="win.ptInBorder" href="#win.ptInBorder">&#x23;</a>
如果坐标在边框范围内返回以下边框名字之一  
top,topleft,topright,bottom,bottomleft,bottomright

### win.ptInBorder(RECT矩形,x坐标,y坐标,上,右,下,左) <a id="win.ptInBorder" href="#win.ptInBorder">&#x23;</a>
上,右,下,左参数指定边框宽度  
可以使用一个参数指定四周边框宽度

### win.pumpMessage() <a id="win.pumpMessage" href="#win.pumpMessage">&#x23;</a>
等待并处理一个窗口消息  
注意如果没有参数,此函数会一直等待

### win.quitMessage() <a id="win.quitMessage" href="#win.quitMessage">&#x23;</a>
退出消息循环  
可在参数中指定 win.loopMessage 退出代码。

### win.registerClassEx("类名",类参数表,"源类名") <a id="win.registerClassEx" href="#win.registerClassEx">&#x23;</a>
注册新类名  
如果参数@3指定了源类名则复制该类  
可选用参数@2指定 WNDCLASSEX的部分字段值

### win.registerFormClass(cls,param,className) <a id="win.registerFormClass" href="#win.registerFormClass">&#x23;</a>
注意窗口类名,  

如果指定了cls，则使用线程ID格式化为伪类名  
此时className为源类名  

如果未指定cls,则直接注册className为类名  
如果该窗口类已存在则直接返回该类名  

此函数返回注册成功的窗口类名

### win.releaseCapture() <a id="win.releaseCapture" href="#win.releaseCapture">&#x23;</a>
释放鼠标捕获,成功返回true

### win.resetMessage() <a id="win.resetMessage" href="#win.resetMessage">&#x23;</a>
自消息队列中移除_WM_QUIT消息,  
使消息循环重置为未退出状态

### win.sendCopyData(窗口句柄,发送数据,数据类型) <a id="win.sendCopyData" href="#win.sendCopyData">&#x23;</a>
使用 _WM_COPYDATA 消息发送字符串到其他进程窗口。  
发送数据可以是字符串或 table 对象,  
数据类型可选指定一个数值

### win.setActive(输入窗口句柄) <a id="win.setActive" href="#win.setActive">&#x23;</a>
设置激活窗口

### win.setCapture(窗口句柄) <a id="win.setCapture" href="#win.setCapture">&#x23;</a>
开始捕获鼠标消息,返回上次调用该函数的窗口句柄

### win.setFocus(输入窗口句柄) <a id="win.setFocus" href="#win.setFocus">&#x23;</a>
设置输入焦点。  
附加外部输入线程后立即调用此函数可能偶尔会无效，可延时至少几十毫秒

### win.setForeground(窗口句柄,禁止从最小化恢复) <a id="win.setForeground" href="#win.setForeground">&#x23;</a>
前置窗口并获取输入焦点。  
如果参数 @2 未指定为 true ，且窗口已最小化，则先恢复并显示窗口。  
当前程序是背景窗口时，win7以上系统在任务栏闪烁。

### win.setInterval(回调函数,延时毫秒数,...) <a id="win.setInterval" href="#win.setInterval">&#x23;</a>

```aardio
win.setInterval(回调函数,延时毫秒数,...setInterval(   
	function(){  
		/*创建定时器。  
应尽量优先调用窗体对象的 setInterval 方法而非 win.setInterval。  
参数 @1 指定执行函数,参数 @2 指定执行间隔，  
可选指定一个或多个回调参数，不指定回调参数则默认为:  
 hwnd,message,timerId,tick,  

如果在定时器中执行了 win.delay 等继续消息循环的代码，  
在定时器退出前不会再触发同一定时器（重入）。  

定时器回调函数无返回值、返回 null 或 true 则继续运行。  
返回 false,0，或用 tonumber 可转换为 0 的值则清除此定时器。  
返回可用 tonumber 转换为非 0 数的值则修改定时器执行间隔（毫秒）*/  
	},1000  
)
```

### win.setOwner <a id="win.setOwner" href="#win.setOwner">&#x23;</a>
设置所有者窗口  
从属窗口总是显示在所有者窗口前面  
例如模态对话框通常会指定一个所有者窗口  

设置了所有者(也没有指定appwindows样式的)的从属窗口不会显示在任务栏  
所有者窗口管理从属窗口的生存期

### win.setOwner(窗口句柄,所有者窗口句柄) <a id="win.setOwner" href="#win.setOwner">&#x23;</a>
成功返回原来的所有者窗口句柄  
窗口拥有WS_CHILD样式时不执行并返回空值

### win.setParent <a id="win.setParent" href="#win.setParent">&#x23;</a>
设置父窗口  
子窗口显示在父窗口客户区  
父窗口管理子窗口的生存期

### win.setParent(子窗口句柄,父窗口句柄) <a id="win.setParent" href="#win.setParent">&#x23;</a>
设置父窗口  
子窗口显示在父窗口客户区

### win.setPos(窗口句柄,x坐标,y坐标,宽,高,插入位置,选项) <a id="win.setPos" href="#win.setPos">&#x23;</a>
调整窗口坐标位置或排序,除句柄外所有参数可选  
同时指定x,y坐标则移动位置  
同时指定宽高则改变大小  
指定插入位置<句柄或_HWND前缀常量>则调整Z序  
选项不用指定，可参考此函数源码了解细节

### win.setRect(输入窗口句柄,rc) <a id="win.setRect" href="#win.setRect">&#x23;</a>
设置窗口相对坐标位置矩形区块。  
参数 @rc 为 ::RECT 结构

### win.setRect(输入窗口句柄,rc,true) <a id="win.setRect" href="#win.setRect">&#x23;</a>
设置窗口屏幕绝对坐标位置矩形区块。  
参数 @rc 为 ::RECT 结构

### win.setText(hwnd,lpString) <a id="win.setText" href="#win.setText">&#x23;</a>
参数(窗口句柄,要设置的文本)  
外部进程窗口请使用winex.setText()函数替代

### win.setTextById(hwnd,id,str) <a id="win.setTextById" href="#win.setTextById">&#x23;</a>
设置窗口上控件的文本  
参数(窗口句柄,控件ID,文本)

### win.setTimeout(回调函数,延时,其他调用参数) <a id="win.setTimeout" href="#win.setTimeout">&#x23;</a>

```aardio
win.setTimeout(  
	function(){  
		/*在已经导入win.ui的界面线程内异步延时执行这里的代码  
除回调函数以外,其他参数都是可选参数  
延时默认为0*/  
	}  
)
```

### win.setTop(输入窗口句柄) <a id="win.setTop" href="#win.setTop">&#x23;</a>
前置窗口到当前线程Z序顶部  
顶层窗口或者设置了 _WS_CLIPSIBLINGS 重叠裁剪样式的窗口向前移动  
子窗口会向后面移动.

### win.setTopmost(输入窗口句柄) <a id="win.setTopmost" href="#win.setTopmost">&#x23;</a>
置顶并显示窗口

### win.setTopmost(输入窗口句柄,false) <a id="win.setTopmost" href="#win.setTopmost">&#x23;</a>
取消置顶窗口

### win.setWindowTheme(hwnd,subAppName,subIdList) <a id="win.setWindowTheme" href="#win.setWindowTheme">&#x23;</a>
设置主题样式  
参数 @2,@3 可传字符串或 null 值

### win.show(hwnd,false) <a id="win.show" href="#win.show">&#x23;</a>
隐藏窗口

### win.show(hwnd,可选输入显示参数) <a id="win.show" href="#win.show">&#x23;</a>
显示窗口,可选输入以_SW_为前缀的显示参数性，  
使用 win.show( hwnd,3/*_SW_MAXIMIZE*/ ) 最大化显示,  
使用 win.show( hwnd,6/*_SW_MINIMIZE*/ ) 最小化显示,  
使用 win.show( hwnd,9/*_SW_RESTORE*/ ) 自最大化或最小化恢复显示。

### win.showForeground(窗口句柄,x,y,cx,cy) <a id="win.showForeground" href="#win.showForeground">&#x23;</a>
把窗口显示在屏幕最前面,最小化窗口自动还原  
类似setForeground但不会改变输入焦点,  
除句柄外,其他参数为可选参数

### win.title <a id="win.title" href="#win.title">&#x23;</a>
窗口默认标题  
如果不指定则自动指定为第一个winform对象的标题

### win.toClient(输入窗口句柄,x,y) <a id="win.toClient" href="#win.toClient">&#x23;</a>
将坐标转换为客户坐标，返回 x,y 坐标值  
::POINT 结构体请直接使用 ::ScreenToClient

### win.toClientRect(输入窗口句柄,rc) <a id="win.toClientRect" href="#win.toClientRect">&#x23;</a>
将::RECT 结构体转换为客户坐标。  
返回值为 ::RECT 结构体

### win.toScreen(输入窗口句柄,x,y) <a id="win.toScreen" href="#win.toScreen">&#x23;</a>
将坐标转换为屏幕坐标，返回 x,y 坐标值  
::POINT 结构体请直接使用 ::ClientToScreen

### win.toScreenRect() <a id="win.toScreenRect" href="#win.toScreenRect">&#x23;</a>
[返回对象:rectObject](https://www.aardio.com/zh-cn/docs/library-reference/global/_.html#rectObject)

### win.toScreenRect(输入窗口句柄,rc) <a id="win.toScreenRect" href="#win.toScreenRect">&#x23;</a>
将::RECT 结构体转换为屏幕坐标。  
返回值为 ::RECT 结构体

### win.wait(等待函数,窗口句柄,超时,延时间隔,...) <a id="win.wait" href="#win.wait">&#x23;</a>
循环执行等待函数,并等待返回值  
直到等待函数返回非空值,或存在第二个返回值,或参数@2指定的窗口关闭  
等待函数返回的值就是win.wait的返回值,  
如果指定超时,超过指定毫秒时返回null,  
除等待函数以外,所有参数可选。  
延时间隔之后的所有参数将作为调用等待函数的参数。

## MsgObject 成员列表 <a id="MsgObject" href="#MsgObject">&#x23;</a>

### MsgObject.hwnd <a id="MsgObject.hwnd" href="#MsgObject.hwnd">&#x23;</a>
窗口句柄

### MsgObject.lParam <a id="MsgObject.lParam" href="#MsgObject.lParam">&#x23;</a>
附加参数

### MsgObject.message <a id="MsgObject.message" href="#MsgObject.message">&#x23;</a>
消息ID

### MsgObject.pt <a id="MsgObject.pt" href="#MsgObject.pt">&#x23;</a>
[返回对象:pointObject](https://www.aardio.com/zh-cn/docs/library-reference/gdip/core.html#pointObject)

### MsgObject.time <a id="MsgObject.time" href="#MsgObject.time">&#x23;</a>
时间

### MsgObject.wParam <a id="MsgObject.wParam" href="#MsgObject.wParam">&#x23;</a>
附加参数

## WINDOWPLACEMENTObject 成员列表 <a id="WINDOWPLACEMENTObject" href="#WINDOWPLACEMENTObject">&#x23;</a>

### WINDOWPLACEMENTObject.ptMaxPosition <a id="WINDOWPLACEMENTObject.ptMaxPosition" href="#WINDOWPLACEMENTObject.ptMaxPosition">&#x23;</a>
最大化左上角左标  

[返回对象:pointObject](https://www.aardio.com/zh-cn/docs/library-reference/gdip/core.html#pointObject)

### WINDOWPLACEMENTObject.ptMinPosition <a id="WINDOWPLACEMENTObject.ptMinPosition" href="#WINDOWPLACEMENTObject.ptMinPosition">&#x23;</a>
最小化左上角坐标  

[返回对象:pointObject](https://www.aardio.com/zh-cn/docs/library-reference/gdip/core.html#pointObject)

### WINDOWPLACEMENTObject.rcNormalPosition <a id="WINDOWPLACEMENTObject.rcNormalPosition" href="#WINDOWPLACEMENTObject.rcNormalPosition">&#x23;</a>
还原状态位置  

[返回对象:rectObject](https://www.aardio.com/zh-cn/docs/library-reference/global/_.html#rectObject)

### WINDOWPLACEMENTObject.showCmd <a id="WINDOWPLACEMENTObject.showCmd" href="#WINDOWPLACEMENTObject.showCmd">&#x23;</a>
_SW_SHOWMAXIMIZED 等表示窗口状态

### WINDOWPLACEMENTObject.update() <a id="WINDOWPLACEMENTObject.update" href="#WINDOWPLACEMENTObject.update">&#x23;</a>
更新窗口位置信息,可选指定一个目标窗口句柄参数

## nmhdrObject 成员列表 <a id="nmhdrObject" href="#nmhdrObject">&#x23;</a>

### nmhdrObject.code <a id="nmhdrObject.code" href="#nmhdrObject.code">&#x23;</a>
通知代码

### nmhdrObject.hwndFrom <a id="nmhdrObject.hwndFrom" href="#nmhdrObject.hwndFrom">&#x23;</a>
发送消息的控件句柄

### nmhdrObject.idFrom <a id="nmhdrObject.idFrom" href="#nmhdrObject.idFrom">&#x23;</a>
发送消息的控件ID

### 全局常量

### ::MSG <a id="::MSG" href="#::MSG">&#x23;</a>
```aardio
class{ 
	addr hwnd;
	INT message;
	ADDR wParam;
	addr lParam;
	INT time;
	int x;
	int y;
}
```

### ::NMHDR <a id="::NMHDR" href="#::NMHDR">&#x23;</a>
```aardio
class {
	addr hwndFrom;
	ADDR idFrom;
	INT code;
}
```

### ::NMHDR() <a id="::NMHDR()" href="#::NMHDR()">&#x23;</a>
通知消息结构体  

[返回对象:nmhdrObject](#nmhdrObject)

### ::WNDCLASSEX <a id="::WNDCLASSEX" href="#::WNDCLASSEX">&#x23;</a>
```aardio
class{ 
    INT cbSize = 48; 
    INT style = 0xB;//_CS_HREDRAW | _CS_VREDRAW | _CS_DBLCLKS;
    pointer lpfnWndProc;
    int cbClsExtra;
    int cbWndExtra;
    pointer hInstance;
    pointer hIcon;
    pointer hCursor;
    pointer hbrBackground;
    ustring lpszMenuName;
    ustring lpszClassName;
    pointer hIconSm;
}
```
