# builtin 库模块帮助文档

## ::Kernel32 成员列表 <a id="::Kernel32" href="#::Kernel32">&#x23;</a>

### ::Kernel32.* <a id="::Kernel32.any" href="#::Kernel32.any">&#x23;</a>
可不用声明直接在此输入函数名并调用API函数  

一、传入参数规则：  
1、null参数不可省略  
2、32位整数类型，小于32位的整数、以及枚举类型都可以直接在API参数中写数值。  
3、对于任何数值类型的指针（输出参数）一律使用结构体表示，例如double * v 表示为{ double v }  
4、数组使用结构体表示  
5、所有结构体传给API的都是指针地址，都是输出参数并增加返回值  

二、返回值规则：  
1、返回值默认为int类型,可用 >>> 0 强制转为无符号数,  
2、可以使用[API尾标]改变返回值为其他类型  

三、所有可用的【API尾标】:  
::Kernel32.ApiNameW() 切换到Unicode版本，字符串UTF8-UTF16双向转换  
::Kernel32.ApiNameA() 切换到ANSI版本,字符串不作任何转换  
::Kernel32.ApiNameL() 返回值为64位LONG类型  
::Kernel32.ApiNameP() 返回值为指针类型  
::Kernel32.ApiNameD() 返回值为double浮点数  
::Kernel32.ApiNameF() 返回值为float浮点数  
::Kernel32.ApiNameB() 返回值为C++中的8位bool类型  
注意【尾标】前必须是小写字母

### ::Kernel32.GetACP() <a id="::Kernel32.GetACP" href="#::Kernel32.GetACP">&#x23;</a>
返回当前ANSI代码页

### ::Kernel32.GetFileAttributes() <a id="::Kernel32.GetFileAttributes" href="#::Kernel32.GetFileAttributes">&#x23;</a>
获取参数 @1 指定路径的文件属性，文件不存在返回 -1。  
参数 @1 应当使用 io.fullpath 转换为完整路径。  

文件属性使用 _FILE_ATTRIBUTE_ 前缀的常量表示。  
使用 fsys.attrib 函数获取或修改文件属性更方便。

### ::Kernel32.GetSystemDefaultLCID() <a id="::Kernel32.GetSystemDefaultLCID" href="#::Kernel32.GetSystemDefaultLCID">&#x23;</a>
返回系统默认区域 ID

### ::Kernel32.GetThreadId(线程句柄) <a id="::Kernel32.GetThreadId" href="#::Kernel32.GetThreadId">&#x23;</a>
将参数 @1 指定的线程句柄转换为线程 ID 。  
使用 thread.open 函数可将线程 ID 转为线程句柄。

### ::Kernel32.GetUserDefaultLangID() <a id="::Kernel32.GetUserDefaultLangID" href="#::Kernel32.GetUserDefaultLangID">&#x23;</a>
返回当前用户使用的默认区域语言 ID，  
这与系统设置：区域语言 / 格式 一致。  
可使用 sys.locale.setUserDefault 函数修改此设置

### ::Kernel32.LocalFree(hMem) <a id="::Kernel32.LocalFree" href="#::Kernel32.LocalFree">&#x23;</a>
一些API返回的内存句柄需要使用此函数释放，  
@hMem参数指定内存句柄

### ::Kernel32.RtlMoveMemory(目标内存地址,源数据,源数据长度) <a id="::Kernel32.RtlMoveMemory" href="#::Kernel32.RtlMoveMemory">&#x23;</a>
复制内存  
此函数支持所有API兼容指针类型参数，直接操作内存请小心使用

源数据可以是字符串、内存指针、或结构体

### ::Kernel32.SetDllDirectory("DLL搜索目录") <a id="::Kernel32.SetDllDirectory" href="#::Kernel32.SetDllDirectory">&#x23;</a>
设置加载DLL的默认目录

### ::Kernel32.SetDllDirectory(null) <a id="::Kernel32.SetDllDirectory" href="#::Kernel32.SetDllDirectory">&#x23;</a>
恢复DLL默认搜索目录

### ::Kernel32.SetErrorMode(0) <a id="::Kernel32.SetErrorMode" href="#::Kernel32.SetErrorMode">&#x23;</a>
显示所有系统错误对话框

### ::Kernel32.api("字符串参数","void()" ) <a id="::Kernel32.api("字符串参数","void" href="#::Kernel32.api("字符串参数","void">&#x23;</a>
声明 Ntdll API 函数

声明 Kernel32 API 函数

### ::Kernel32.gethandle() <a id="::Kernel32.gethandle" href="#::Kernel32.gethandle">&#x23;</a>
返回句柄

返回句柄

## ::Ntdll 成员列表 <a id="::Ntdll" href="#::Ntdll">&#x23;</a>

### ::Ntdll.* <a id="::Ntdll.any" href="#::Ntdll.any">&#x23;</a>
可不用声明直接在此输入函数名并调用API函数  

一、传入参数规则：  
1、null参数不可省略  
2、32位整数类型，小于32位的整数、以及枚举类型都可以直接在API参数中写数值。  
3、对于任何数值类型的指针（输出参数）一律使用结构体表示，例如double * v 表示为{ double v }  
4、数组使用结构体表示  
5、所有结构体传给API的都是指针地址，都是输出参数并增加返回值  

二、返回值规则：  
1、返回值默认为int类型,可用 >>> 0 强制转为无符号数,  
2、可以使用[API尾标]改变返回值为其他类型  

三、所有可用的【API尾标】:  
::Kernel32.ApiNameW() 切换到Unicode版本，字符串UTF8-UTF16双向转换  
::Kernel32.ApiNameA() 切换到ANSI版本,字符串不作任何转换  
::Kernel32.ApiNameL() 返回值为64位LONG类型  
::Kernel32.ApiNameP() 返回值为指针类型  
::Kernel32.ApiNameD() 返回值为double浮点数  
::Kernel32.ApiNameF() 返回值为float浮点数  
::Kernel32.ApiNameB() 返回值为C++中的8位bool类型  
注意【尾标】前必须是小写字母

### ::Ntdll.RtlZeroMemory(bufferOrPointer,size) <a id="::Ntdll.RtlZeroMemory" href="#::Ntdll.RtlZeroMemory">&#x23;</a>
内存清零（填充空字节）。  
参数 @bufferOrPointer 可指定 buffer 或指针。  
参数 @size 指定清零的字节长度，请避免传入错误的长度，原生 API 不会检查内存边界。

## ::User32 成员列表 <a id="::User32" href="#::User32">&#x23;</a>

### ::User32.* <a id="::User32.any" href="#::User32.any">&#x23;</a>
可不用声明直接在此输入函数名并调用API函数  

一、传入参数规则：  
1、null参数不可省略  
2、32位整数类型，小于32位的整数、以及枚举类型都可以直接在API参数中写数值。  
3、对于任何数值类型的指针（输出参数）一律使用结构体表示，例如double * v 表示为{ double v }  
4、数组使用结构体表示  
5、所有结构体传给API的都是指针地址，都是输出参数并增加返回值  

二、返回值规则：  
1、返回值默认为int类型,可用 >>> 0 强制转为无符号数,  
2、可以使用[API尾标]改变返回值为其他类型  

三、所有可用的【API尾标】:  
::User32.ApiNameW() 切换到Unicode版本，字符串UTF8-UTF16双向转换  
::User32.ApiNameA() 切换到ANSI版本,字符串不作任何转换  
::User32.ApiNameL() 返回值为64位LONG类型  
::User32.ApiNameP() 返回值为指针类型  
::User32.ApiNameD() 返回值为double浮点数  
::User32.ApiNameF() 返回值为float浮点数  
::User32.ApiNameB() 返回值为C++中的8位bool类型  
注意【尾标】前必须是小写字母

### ::User32.DestroyWindow() <a id="::User32.DestroyWindow" href="#::User32.DestroyWindow">&#x23;</a>
销毁窗口，  
参数指定窗口句柄，也就是窗口对象的 hwnd 属性。  
销毁窗口不会触发窗口的 onClose 事件，  
但会触发 onDestroy 事件

### ::User32.GetAsyncKeyState() <a id="::User32.GetAsyncKeyState" href="#::User32.GetAsyncKeyState">&#x23;</a>
参数 @1 使用数值指定虚拟键码。  
返回值为 16位数值，最高位表示指定物理按键是否按下。  
应当将返回值与 0x8000 做按位与运算取最高位。  

物理按键状态并不一定等于特定界面线程中的按键状态。  
此函数忽略键盘映射，可用于非 UI 线程，  
并且不能用于检测按键开关状态（nmlk,scrlk,capslk）。  
key.getStateX 内部调用此函数。

### ::User32.GetCaretPos() <a id="::User32.GetCaretPos" href="#::User32.GetCaretPos">&#x23;</a>
获取输入光标的控件客户区坐标。  
参数必须是接收输出值的 ::POINT 结构体。  
成功返回非零值。  

使用 winex.caret 可获取屏幕坐标。

### ::User32.GetCursorPos() <a id="::User32.GetCursorPos" href="#::User32.GetCursorPos">&#x23;</a>
返回鼠标当前位置,参数应当是一个::POINT结构体  
成功返回非零值

### ::User32.GetKeyState() <a id="::User32.GetKeyState" href="#::User32.GetKeyState">&#x23;</a>
自当前线程消息队列中检测指定按键的是否按下，不一定是物理按键的真实状态。  
仅可用于 U I线程，即使线徎或进程不是前台焦点，函数仍然可以工作，  

参数 @1 使用数值指定虚拟键码。  
返回值为 16位数值，最高位表示指定按键是否按下。  
可将返回值与 0x8000 做按位与运算取最高位。  
返回值的最低位表示 NumLk,CapsLk,ScrLk 的开关状态。  
key.getState 内部调用此函数。

### ::User32.GetSystemMetrics() <a id="::User32.GetSystemMetrics" href="#::User32.GetSystemMetrics">&#x23;</a>
返回系统系统与数值有关的设置,宽高有关的数值以像素为单位,  
参数以 _SM_ 前缀的常量指定要获取的设置索引

### ::User32.GetWindowThreadProcessId(hwnd,pid) <a id="::User32.GetWindowThreadProcessId" href="#::User32.GetWindowThreadProcessId">&#x23;</a>
返回 @hwnd 参数指定窗口句柄的窗口所在线程 ID,  
@pid 如果不为 null 则必须传入结构体 {addr value},  
也可以改用 win.getThreadProcessId 函数

### ::User32.LoadCursor(hInstance,lpCursorName) <a id="::User32.LoadCursor" href="#::User32.LoadCursor">&#x23;</a>
加载光标。  
参数 @hInstance 一般指定为 null。  
参数 @lpCursorName 指定 _IDC_ 前缀数值加载共享光标（不需要释放）  
默认返回数值，加大写 P 尾标返回指针  

返回的光标句柄可作为 ::User32.SetCursor 的参数，  
也可以指定为plus 控件的 cursor 属性。

### ::User32.PostMessage <a id="::User32.PostMessage" href="#::User32.PostMessage">&#x23;</a>
通过创建目标窗口线程的消息队列发送消息给目标窗口,不等待返回，  
注意消息队列等待处理的消息超过 10000 条消息时将会丢弃消息

### ::User32.PostMessage(hwnd,message,wParam,lParam) <a id="::User32.PostMessage" href="#::User32.PostMessage">&#x23;</a>
通过消息队列发送消息给目标窗口,不等待返回。  
@hwnd 指定目标窗口句柄，设为 0xFFFF（65535） 则发送到所有顶层窗口。  
参数@2为消息ID，一般是 _WM_ 开头的常量。  
一定要指定4个参数,省略参数输入null或0不可省略  
注意不要在参数中包含在调用函数后可能释放的指针

### ::User32.PostThreadMessage(idThread,message,wParam,lParam) <a id="::User32.PostThreadMessage" href="#::User32.PostThreadMessage">&#x23;</a>
过消息队列发送消息给目标线程,不等待返回。  
- @idThread 指定目标线程 ID。  
创建工作线程必须调用 win.loopMessage 才能响应消息。  
使用 thread.invoke 创建线程可直接返回线程 ID。用 ::Kernel32.GetThreadId 可自线程句柄获取线程 ID。  
- 参数 @2 为消息ID，一般是 _WM_ 开头的常量。  
一定要指定 4 个参数,省略参数输入 null 或 0 不可省略  
注意不要在参数中包含在调用函数后可能释放的指针

### ::User32.SendMessage <a id="::User32.SendMessage" href="#::User32.SendMessage">&#x23;</a>
发送消息到目标窗口，并等待返回，  
如果目标窗口卡住，可能导致不必要的等待过程

### ::User32.SendMessage(hwnd,message,wParam,lParam) <a id="::User32.SendMessage" href="#::User32.SendMessage">&#x23;</a>
发送消息到目标窗口，并等待返回。  
@hwnd 指定目标窗口句柄，设为 0xFFFF（65535） 则发送到所有顶层窗口。  
参数@2为消息ID，一般是 _WM_ 开头的常量。  
一定要指定4个参数,省略参数输入null或0不可省略

### ::User32.SendMessageTimeout <a id="::User32.SendMessageTimeout" href="#::User32.SendMessageTimeout">&#x23;</a>
发送消息到目标窗口，并可设置超时参数

### ::User32.SendMessageTimeout(hwnd, message, wParam,lParam,flags,timeout,pRet) <a id="::User32.SendMessageTimeout" href="#::User32.SendMessageTimeout">&#x23;</a>
用法请参考该 API 文档

### ::User32.SendNotifyMessage <a id="::User32.SendNotifyMessage" href="#::User32.SendNotifyMessage">&#x23;</a>
发送消息到目标窗口，  
发生到调用线程创建的窗口等待窗口消息处理完消息后返回，  
发生到其他线程不等待立即返回。  

注意这个函数并非将消息发送到消息队列，  
不会因为消息队列满被丢弃

### ::User32.SendNotifyMessage(hwnd,message,wParam,lParam) <a id="::User32.SendNotifyMessage" href="#::User32.SendNotifyMessage">&#x23;</a>
发送消息到目标窗口，  
@hwnd 指定目标窗口句柄，设为 0xFFFF（65535） 则发送到所有顶层窗口。  
参数@2为消息ID，一般是 _WM_ 开头的常量。  
一定要指定4个参数,省略参数输入null或0不可省略  
注意不要在参数中包含在调用函数后可能释放的指针，  
但对 0xFFFF 发送 _WM_SETTINGCHANGE 消息时可指定字符串参数

### ::User32.SetCursor() <a id="::User32.SetCursor" href="#::User32.SetCursor">&#x23;</a>
用于在响应窗口消息 _WM_SETCURSOR 时设置光标。  
参数 @1 指定光标句柄，可用 ::User32.LoadCursor 函数加载。  
plus 控件可以直接指定 cursor 属性。

### ::User32.SetCursorPos(x,y) <a id="::User32.SetCursorPos" href="#::User32.SetCursorPos">&#x23;</a>
设置鼠标当前位置,参数指定x,y坐标  
成功返回非零值

### ::User32.SystemParametersInfo(uiAction,uiParam,pvParam,fWinIni) <a id="::User32.SystemParametersInfo" href="#::User32.SystemParametersInfo">&#x23;</a>
设置或获取系统参数,  
失败返回0,成功返回非零值,  

参数@1指定 _SPI_ 前缀常量,@pvParam 为指针或结构体指针,  
其他参数都为无符号32位整数。参数 @4 设为 3 也即   
_SPIF_UPDATEINIFILE | _SPIF_SENDWININICHANGE   
用于刷新配置,读取值时参数 @4 设为 0 即可  

这个函数的设置项非常多,细节请参考该 API 文档

### ::User32.api("字符串参数","void()" ) <a id="::User32.api("字符串参数","void" href="#::User32.api("字符串参数","void">&#x23;</a>
声明 User32 API 函数

### 全局常量

### ::CopyMemory(目标内存地址,源地址,源数据长度) <a id="::CopyMemory(目标内存地址,源地址,源数据长度)" href="#::CopyMemory(目标内存地址,源地址,源数据长度)">&#x23;</a>
复制内存  
此函数调用::Kernel32.RtlMoveMemory

### ::CopyMemoryByStruct(目标内存地址,源结构体,源结构体长度) <a id="::CopyMemoryByStruct(目标内存地址,源结构体,源结构体长度)" href="#::CopyMemoryByStruct(目标内存地址,源结构体,源结构体长度)">&#x23;</a>
复制结构体到目标内存  
此函数调用::Kernel32.RtlMoveMemory

### ::FILETIME() <a id="::FILETIME()" href="#::FILETIME()">&#x23;</a>
FILETIME 结构体,  
用于表示自 1601年1月1日 开始以 100纳秒 为间隔的数值。  
100纳秒 也就是 0.0001毫秒。  

此结构体包含 2 个 32 无符号位整数字段：dwLowDateTime,dwHighDateTime。  

标准库 fsys.time 可创建 ::FILETIME 兼容结构体，  
并且提供了更多功能

### ::GetLastError() <a id="::GetLastError()" href="#::GetLastError()">&#x23;</a>
返回系统错误代码

### ::GetModuleHandle(模块名) <a id="::GetModuleHandle(模块名)" href="#::GetModuleHandle(模块名)">&#x23;</a>
返回动态链接库的模块句柄

### ::GlobalAlloc(分配选项,内存长度) <a id="::GlobalAlloc(分配选项,内存长度)" href="#::GlobalAlloc(分配选项,内存长度)">&#x23;</a>
在进程堆上分配内存,  
分配选项可选参数如下:  

0x40/*_GPTR*/ 返回指针,内存数据初始化为零  
0x42/*_GHND*/ 返回句柄,内存数据初始化为零,  
0x0/*_GMEM_FIXED*/ 返回指针  
0x2/*_GMEM_MOVEABLE*/ 返回句柄  
内存句柄需要调用 ::GlobalLock 函数转换为内存指针

### ::GlobalFree(内存句柄) <a id="::GlobalFree(内存句柄)" href="#::GlobalFree(内存句柄)">&#x23;</a>
释放::GlobalAlloc()分配的内存  
如果成功返回null,否则返回传入句柄

### ::GlobalLock(内存句柄) <a id="::GlobalLock(内存句柄)" href="#::GlobalLock(内存句柄)">&#x23;</a>
锁定::GlobalAlloc(0x2/*_GMEM_MOVEABLE*/)创建的内存句柄,  
并返回内存指针指针

### ::GlobalReAlloc(内存句柄,新的长度,分配选项) <a id="::GlobalReAlloc(内存句柄,新的长度,分配选项)" href="#::GlobalReAlloc(内存句柄,新的长度,分配选项)">&#x23;</a>
改变GlobalAlloc函数申请的内存大小  
分配选项参考 GlobalAlloc() 说明

### ::GlobalSize(内存句柄) <a id="::GlobalSize(内存句柄)" href="#::GlobalSize(内存句柄)">&#x23;</a>
获取内存长度

### ::GlobalUnlock(内存句柄) <a id="::GlobalUnlock(内存句柄)" href="#::GlobalUnlock(内存句柄)">&#x23;</a>
解锁::GlobalAlloc(0x2/*_GMEM_MOVEABLE*/)创建的内存句柄,  
成功返回true

### ::HIBYTE <a id="::HIBYTE" href="#::HIBYTE">&#x23;</a>
`function(l) {return   (l   >> 8) & 0xff  }`

### ::HIWORD <a id="::HIWORD" href="#::HIWORD">&#x23;</a>
`function(l) {return  (l >> 16) & 0xffff }`

### ::Kernel32 <a id="::Kernel32" href="#::Kernel32">&#x23;</a>
默认已加载的Kernel32.dll模块对象  
Kernel32.dll是Windows内置库,提供很多常用API

### ::LOBYTE <a id="::LOBYTE" href="#::LOBYTE">&#x23;</a>
`function(l) {return l  & 0xff }`

### ::LOWORD <a id="::LOWORD" href="#::LOWORD">&#x23;</a>
`function(l) {return l & 0xffff }`

### ::MAKELONG <a id="::MAKELONG" href="#::MAKELONG">&#x23;</a>
`function(a,b){ return ( ( (b & 0xFFFF) << 16) | (a & 0xFFFF) ) & 0xFFFFFFFF }`

### ::MAKEWORD <a id="::MAKEWORD" href="#::MAKEWORD">&#x23;</a>
`function (a,b){ return ( ( ( b & 0xFF) << 8) | ( a & 0xFF) ) & 0xFFFF  }`

### ::Ntdll <a id="::Ntdll" href="#::Ntdll">&#x23;</a>
默认已加载的系统 DLL 组件 ntdll.dll。  

调用 lasterr 函数获取此 DLL 的错误信息时，需要将将参数 @3 显式指定为 ::Ntdll

### ::User32 <a id="::User32" href="#::User32">&#x23;</a>
默认已加载的User32.dll模块对象  
User32.dll提供Windows用户界面相关API
