wapi

package
v1.3.399 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 9, 2026 License: MIT Imports: 6 Imported by: 17

Documentation

Overview

Package wapi 封装了 windows 系统的 api.

Index

Examples

Constants

View Source
const (
	// 无法创建对话框。通用对话框函数对 DialogBox 函数的调用失败。
	// 例如,如果公共对话框调用指定了无效的窗口句柄,则会发生此错误。
	CDERR_DIALOGFAILURE uint32 = 0xFFFF

	// 通用对话框函数未能找到指定的资源。
	CDERR_FINDRESFAILURE uint32 = 0x0006

	// 常见对话框函数在初始化期间失败。当内存不足时,通常会发生此错误。
	CDERR_INITIALIZATION uint32 = 0x0002

	// 通用对话框函数未能加载指定的资源。
	CDERR_LOADRESFAILURE uint32 = 0x0007

	// 通用对话框函数未能加载指定的字符串。
	CDERR_LOADSTRFAILURE uint32 = 0x0005

	// 通用对话框函数未能锁定指定的资源。
	CDERR_LOCKRESFAILURE uint32 = 0x0008

	// 通用对话框函数无法为内部结构分配内存。
	CDERR_MEMALLOCFAILURE uint32 = 0x0009

	// 通用对话框函数无法锁定与句柄关联的内存。
	CDERR_MEMLOCKFAILURE uint32 = 0x000A

	// ENABLETEMPLATE 标志是在相应公共对话框的初始化结构的 Flags 成员中设置的,
	// 但未能提供相应的实例句柄。
	CDERR_NOHINSTANCE uint32 = 0x0004

	// ENABLEHOOK 标志是在相应公共对话框的初始化结构的 Flags 成员中设置的,
	// 但未能提供指向相应挂钩过程的指针。
	CDERR_NOHOOK uint32 = 0x000B

	// ENABLETEMPLATE 标志是在相应公共对话框的初始化结构的 Flags 成员中设置的,
	// 但未能提供相应的模板。
	CDERR_NOTEMPLATE uint32 = 0x0003

	// RegisterWindowMessage 函数在由通用对话框函数调用时返回错误代码。
	CDERR_REGISTERMSGFAIL uint32 = 0x000C

	// 对应公共对话框的初始化结构的 lStructSize 成员无效。
	CDERR_STRUCTSIZE uint32 = 0x0001

	// CHOOSEFONT 结构的 nSizeMax 成员中指定的大小小于 nSizeMin 成员中指定的大小。
	CFERR_MAXLESSTHANMIN uint32 = 0x2002
	// 不存在字体。
	CFERR_NOFONTS uint32 = 0x2001

	// OPENFILENAME 结构的 lpstrFile 成员指向的缓冲区对于用户指定的文件名来说太小。
	// lpstrFile 缓冲区的前两个字节包含一个整数值,该值指定接收全名所需的大小(以字符为单位)。
	FNERR_BUFFERTOOSMALL uint32 = 0x3003
	// 文件名无效。
	FNERR_INVALIDFILENAME uint32 = 0x3002
	// 尝试将列表框子类化失败,因为没有足够的内存可用。
	FNERR_SUBCLASSFAILURE uint32 = 0x3001

	// FINDREPLACE 结构的成员指向无效的缓冲区。
	FRERR_BUFFERLENGTHZERO uint32 = 0x4001
)
View Source
const (
	MAX_PATH = 260

	ERROR_SUCCESS          syscall.Errno = 0
	ERROR_FILE_NOT_FOUND   syscall.Errno = 2
	ERROR_NOT_ENOUGH_QUOTA syscall.Errno = 0x718 // 处理此命令的配额不够。
	ERROR_INVALID_INDEX    syscall.Errno = 0x585 // 索引无效。
)
View Source
const (
	S_OK               syscall.Errno = 0x00000000
	S_FALSE            syscall.Errno = 0x00000001
	RPC_E_CHANGED_MODE syscall.Errno = 0x80010106 // 并发模型冲突(如 CoInitializeEx 调用不兼容)
	E_INVALIDARG       syscall.Errno = 0x80070057 // 参数无效
	E_OUTOFMEMORY      syscall.Errno = 0x8007000E // 内存不足
	E_UNEXPECTED       syscall.Errno = 0x8000FFFF // 未知意外错误
	E_FAIL             syscall.Errno = 0x80004005 // 未指定的失败
	RO_E_CLOSED        syscall.Errno = 0x80000013 // 对象已关闭, 无法再使用
)
View Source
const (
	FILE_ATTRIBUTE_ARCHIVE   uint32 = 0x20   // 文件应存档,应用程序使用此属性标记文件以供备份或删除
	FILE_ATTRIBUTE_ENCRYPTED uint32 = 0x4000 // 文件或目录已加密. 对于文件,这意味着文件中的所有数据都已加密。 对于目录,这意味着加密是新创建的文件和子目录的默认值。
	FILE_ATTRIBUTE_HIDDEN    uint32 = 0x2    // 文件已隐藏,不要将其包含在普通目录列表中
	FILE_ATTRIBUTE_NORMAL    uint32 = 0x80   // 文件没有设置其他属性,仅当单独使用时有效
	FILE_ATTRIBUTE_OFFLINE   uint32 = 0x1000 // 文件数据不会立即可用,指示文件数据已移至脱机存储
	FILE_ATTRIBUTE_READONLY  uint32 = 0x1    // 文件是只读的,应用程序可以读取但无法写入或删除
	FILE_ATTRIBUTE_SYSTEM    uint32 = 0x4    // 文件是操作系统的一部分或专供其使用
	FILE_ATTRIBUTE_TEMPORARY uint32 = 0x100  // 文件用于临时存储
)

文件属性常量,用于指定文件的属性

View Source
const (
	FILE_FLAG_BACKUP_SEMANTICS   uint32 = 0x02000000 // 为备份或还原操作打开文件
	FILE_FLAG_DELETE_ON_CLOSE    uint32 = 0x04000000 // 文件将在关闭所有句柄后立即删除
	FILE_FLAG_NO_BUFFERING       uint32 = 0x20000000 // 文件或设备正在打开,没有系统缓存
	FILE_FLAG_OPEN_NO_RECALL     uint32 = 0x00100000 // 请求文件数据,但应继续位于远程存储中
	FILE_FLAG_OPEN_REPARSE_POINT uint32 = 0x00200000 // 不进行正常的重新分析点处理
	FILE_FLAG_OVERLAPPED         uint32 = 0x40000000 // 文件或设备正在为异步 I/O 打开或创建
	FILE_FLAG_POSIX_SEMANTICS    uint32 = 0x01000000 // 访问将按照 POSIX 规则进行
	FILE_FLAG_RANDOM_ACCESS      uint32 = 0x10000000 // 访问旨在随机访问
	FILE_FLAG_SESSION_AWARE      uint32 = 0x00800000 // 正在打开具有会话感知的文件或设备
	FILE_FLAG_SEQUENTIAL_SCAN    uint32 = 0x08000000 // 访问旨在从头到尾顺序进行
	FILE_FLAG_WRITE_THROUGH      uint32 = 0x80000000 // 写入操作将直接转到磁盘
)

文件标志常量,用于CreateFile等函数的dwFlagsAndAttributes参数

View Source
const (
	PM_NOREMOVE uint32 = 0x0000 // PeekMessage 处理后,消息不会从队列中删除。
	PM_REMOVE   uint32 = 0x0001 // PeekMessage 处理后,将从队列中删除消息。
	PM_NOYIELD  uint32 = 0x0002 // 防止系统释放等待调用方空闲的任何线程(请参阅 WaitForInputIdle)。将此值与 PM_NOREMOVE 或 PM_REMOVE 组合在一起。
)
View Source
const (
	PM_QS_INPUT       = QS_INPUT << 16                                // 处理鼠标和键盘消息
	PM_QS_PAINT       = QS_PAINT << 16                                // 处理绘制消息
	PM_QS_POSTMESSAGE = (QS_POSTMESSAGE | QS_HOTKEY | QS_TIMER) << 16 // 处理所有已发布的消息,包括计时器和热键
	PM_QS_SENDMESSAGE = QS_SENDMESSAGE << 16                          // 处理所有已发送的消息
)
View Source
const (
	QS_KEY                  uint32 = 0x0001                          // 键盘消息
	QS_MOUSEMOVE            uint32 = 0x0002                          // 鼠标移动消息
	QS_MOUSEBUTTON          uint32 = 0x0004                          // 鼠标按钮消息
	QS_POSTMESSAGE          uint32 = 0x0008                          // 已发布的消息
	QS_TIMER                uint32 = 0x0010                          // 计时器消息
	QS_PAINT                uint32 = 0x0020                          // 绘制消息
	QS_SENDMESSAGE          uint32 = 0x0040                          // 已发送的消息
	QS_HOTKEY               uint32 = 0x0080                          // 热键消息
	QS_ALLPOSTMESSAGEuint32 uint32 = 0x0100                          // 所有已发布的消息
	QS_RAWINPUT             uint32 = 0x0400                          // 原始输入消息
	QS_MOUSE                       = QS_MOUSEMOVE | QS_MOUSEBUTTON   // 所有鼠标消息
	QS_INPUT                       = QS_MOUSE | QS_KEY | QS_RAWINPUT // 所有输入消息
)
View Source
const (
	CS_BYTEALIGNCLIENT uint32 = 0x1000     // 将窗口的工作区与 x 方向的字节边界对齐. 此样式会影响窗口的宽度及其在显示器上的水平位置。
	CS_BYTEALIGNWINDOW uint32 = 0x2000     // 使窗口在字节边界 (沿 x 方向) 对齐. 此样式会影响窗口的宽度及其在显示器上的水平位置。
	CS_CLASSDC         uint32 = 0x0040     // 分配一个设备上下文,以便类中的所有窗口共享. 由于窗口类特定于进程,因此应用程序的多个线程可以创建同一类的窗口。 线程还可以尝试同时使用设备上下文。 发生这种情况时,系统仅允许一个线程成功完成其绘制操作。
	CS_DBLCLKS         uint32 = 0x0008     // 当用户在光标位于属于类的窗口中时双击鼠标时,将双击消息发送到窗口过程
	CS_DROPSHADOW      uint32 = 0x00020000 // 在窗口上启用投影效果. 通过 SPI_SETDROPSHADOW 打开和关闭效果。 通常,对于小型、生存期较短的窗口(如菜单)启用此功能,以强调其与其他窗口的 Z 顺序关系。 从具有此样式的类创建的 Windows 必须是顶级窗口;它们可能不是子窗口。
	CS_GLOBALCLASS     uint32 = 0x4000     // 指示窗口类是应用程序全局类
	CS_HREDRAW         uint32 = 0x0002     // 如果移动或大小调整更改了工作区的宽度,则重绘整个窗口
	CS_NOCLOSE         uint32 = 0x0200     // 在窗口菜单上禁用“关闭”
	CS_OWNDC           uint32 = 0x0020     // 为类中的每个窗口分配唯一的设备上下文
	CS_PARENTDC        uint32 = 0x0080     // 将子窗口的剪裁矩形设置为父窗口的剪裁矩形,以便子窗口可以在父窗口上绘制. 具有 CS_PARENTDC 样式位的窗口从系统的设备上下文缓存接收常规设备上下文。 它不会为子级提供父级的设备上下文或设备上下文设置。 指定 CS_PARENTDC 可增强应用程序的性能。

	// 保存此类窗口遮盖的屏幕图像部分作为位图。 删除窗口时,系统会使用保存的位图还原屏幕图像,包括被遮盖的其他窗口。 因此,如果位图使用的内存尚未丢弃,并且其他屏幕操作未使存储的图像失效,则系统不会将 WM_PAINT 消息发送到被遮盖的窗口。
	//
	// 此样式适用于小型窗口 (例如菜单或对话框) ,这些菜单或对话框在发生其他屏幕活动之前会短暂显示,然后删除。 此样式会增加显示窗口所需的时间,因为系统必须先分配内存来存储位图。
	CS_SAVEBITS uint32 = 0x0800
	CS_VREDRAW  uint32 = 0x0001 // 如果移动或大小调整更改了工作区的高度,则重新绘制整个窗口
)
View Source
const (
	// GWL_EXSTYLE 设置新的扩展窗口样式。
	GWL_EXSTYLE int32 = -20

	// GWLP_HINSTANCE 设置新的应用程序实例句柄。
	GWLP_HINSTANCE int32 = -6

	// GWLP_ID 设置子窗口的新标识符。窗口不能是顶级窗口。
	GWLP_ID int32 = -12

	// GWL_STYLE 设置新的窗口样式。
	GWL_STYLE int32 = -16

	// GWLP_USERDATA 设置与窗口关联的用户数据。
	// 此数据供创建窗口的应用程序使用。其值最初为零。
	GWLP_USERDATA int32 = -21

	// GWLP_WNDPROC 设置窗口过程的新地址。
	GWLP_WNDPROC int32 = -4
)

窗口属性索引常量.

View Source
const (
	// DWLP_DLGPROC 设置指向对话框过程的新指针。
	DWLP_DLGPROC = unsafe.Sizeof(uintptr(0)) * 4 // 通常为 4 或 8,取决于系统架构(32 位或 64 位)

	// DWLP_MSGRESULT 设置在对话框过程中处理的消息的返回值。
	DWLP_MSGRESULT = 0

	// DWLP_USER 设置与对话框关联的用户数据。
	DWLP_USER = DWLP_DLGPROC + unsafe.Sizeof(uintptr(0)) // 通常为 DWLP_DLGPROC + 4 或 +8
)

对话框属性索引常量

View Source
const (
	IDC_ARROW       = 32512 // 标准箭头光标
	IDC_IBEAM       = 32513 // 文本输入光标(I 型光标)
	IDC_WAIT        = 32514 // 等待光标(沙漏)
	IDC_CROSS       = 32515 // 十字光标
	IDC_UPARROW     = 32516 // 垂直箭头光标
	IDC_SIZENWSE    = 32642 // 双箭头光标, 对角线调整大小 1(西北-东南)
	IDC_SIZENESW    = 32643 // 双箭头光标, 对角线调整大小 2(东北-西南)
	IDC_SIZEWE      = 32644 // 双箭头光标, 水平调整大小(水平)
	IDC_SIZENS      = 32645 // 双箭头光标, 垂直调整大小(垂直)
	IDC_SIZEALL     = 32646 // 四向箭头光标, 移动
	IDC_NO          = 32648 // 禁止光标(圆圈斜杠)
	IDC_HAND        = 32649 // 手形光标
	IDC_APPSTARTING = 32650 // 应用程序启动光标(箭头+沙漏)
	IDC_HELP        = 32651 // 帮助光标(箭头+问号)
	IDC_PIN         = 32671 // 位置选择(表示固定或定位)
	IDC_PERSON      = 32672 // 人员选择(表示用户或联系人)
)

系统预定义的标准光标标识符, https://learn.microsoft.com/zh-cn/windows/win32/menurc/about-cursors.

View Source
const (
	NullStr  = "\x00"
	NullStr2 = NullStr + NullStr // 2个 NullStr
)
View Source
const (
	Mod_Alt      uint32 = 0x0001 // 必须按住任一 ALT 键.
	Mod_Control  uint32 = 0x0002 // 必须按住任一 CTRL 键.
	Mod_Norepeat uint32 = 0x4000 // 更改热键行为,以便键盘自动重复不会产生多个热键通知。Windows Vista:  不支持此标志.
	Mod_Shift    uint32 = 0x0004 // 必须按住任一 SHIFT 键.
	Mod_Win      uint32 = 0x0008 // 任一 WINDOWS 键被按住。这些键标有 Windows 徽标。涉及 WINDOWS 键的键盘快捷键保留供操作系统使用.
)
View Source
const (
	WM_PAINT            uint32 = 15     // 窗口绘制消息
	WM_CLOSE            uint32 = 16     // 窗口关闭消息.
	WM_DESTROY          uint32 = 2      // 窗口销毁消息.
	WM_NCDESTROY        uint32 = 130    // 窗口非客户区销毁消息, 在 WM_DESTROY 之后.
	WM_MOUSEMOVE        uint32 = 512    // 窗口鼠标移动消息.
	WM_LBUTTONDOWN      uint32 = 513    // 窗口鼠标左键按下消息
	WM_LBUTTONUP        uint32 = 514    // 窗口鼠标左键弹起消息.
	WM_RBUTTONDOWN      uint32 = 516    // 窗口鼠标右键按下消息.
	WM_RBUTTONUP        uint32 = 517    // 窗口鼠标右键弹起消息.
	WM_LBUTTONDBLCLK    uint32 = 515    // 窗口鼠标左键双击消息.
	WM_RBUTTONDBLCLK    uint32 = 518    // 窗口鼠标右键双击消息.
	WM_MBUTTONDOWN      uint32 = 519    // 窗口鼠标中键按下消息.
	WM_MBUTTONUP        uint32 = 520    // 窗口鼠标中键弹起消息.
	WM_MOUSEWHEEL       uint32 = 522    // 窗口鼠标滚轮滚动消息.
	WM_XBUTTONDOWN      uint32 = 523    // 鼠标按下第一个或第二个 X 按钮.
	WM_XBUTTONUP        uint32 = 524    // 鼠标弹起第一个或第二个 X 按钮.
	WM_XBUTTONDBLCLK    uint32 = 525    // 鼠标双击第一个或第二个 X 按钮.
	WM_NCXBUTTONDOWN    uint32 = 171    // 鼠标按下第一个或第二个 X 按钮.
	WM_NCXBUTTONUP      uint32 = 172    // 鼠标弹起第一个或第二个 X 按钮.
	WM_NCXBUTTONDBLCLK  uint32 = 173    // 鼠标双击第一个或第二个 X 按钮.
	WM_EXITSIZEMOVE     uint32 = 562    // 窗口退出移动或调整大小模式循环改,详情参见MSDN.
	WM_MOUSEHOVER       uint32 = 673    // 窗口鼠标进入消息
	WM_MOUSELEAVE       uint32 = 675    // 窗口鼠标离开消息.
	WM_SIZE             uint32 = 5      // 窗口大小改变消息.
	WM_TIMER            uint32 = 275    // 窗口定时器消息.
	WM_SETFOCUS         uint32 = 7      // 窗口获得焦点.
	WM_KILLFOCUS        uint32 = 8      // 窗口失去焦点.
	WM_KEYDOWN          uint32 = 256    // 窗口键盘按键消息.
	WM_KEYUP            uint32 = 257    // 窗口键盘按键弹起消息.
	WM_SYSKEYDOWN       uint32 = 260    // 当用户按下F10键(激活菜单栏)或按住ALT键然后按下另一个键时,发布到具有键盘焦点的窗口。当当前没有窗口具有键盘焦点时,也会发生这种情况;在这种情况下, WM_SYSKEYDOWN 消息被发送到活动窗口。接收消息的窗口可以通过检查lParam参数中的上下文代码来区分这两个上下文.
	WM_SYSKEYUP         uint32 = 261    // 当用户释放按住 Alt 键时按下的键时,使用键盘焦点发布到窗口。 当当前没有窗口具有键盘焦点时,也会发生这种情况;在这种情况下, WM_SYSKEYUP 消息将发送到活动窗口。 接收消息的窗口可以通过检查 lParam 中的上下文代码来区分这两个上下文.
	WM_CAPTURECHANGED   uint32 = 533    // 窗口鼠标捕获改变消息.
	WM_SETCURSOR        uint32 = 32     // 窗口设置鼠标光标.
	WM_CHAR             uint32 = 258    // 窗口字符消息.
	WM_DROPFILES        uint32 = 563    // 拖动文件到窗口.
	WM_HOTKEY           uint32 = 0x0312 // 当用户按下 RegisterHotKey 函数注册的热键时发布。消息放置在与注册热键的线程关联的消息队列的顶部.
	WM_SETICON          uint32 = 0x0080 // 设置窗口图标的消息
	WM_ACTIVATE         uint32 = 6      // 窗口激活消息, 发送到正在激活的窗口和正在停用的窗口.
	WM_MOVE             uint32 = 3      // 窗口移动消息.
	WM_MOVING           uint32 = 534    // 当用户正在移动窗口时,该消息会被发送到窗口.
	WM_GETMINMAXINFO    uint32 = 36     // 获取窗口最小最大尺寸信息.
	WM_QUIT             uint32 = 0x0012 // 应用程序退出消息.
	WM_KEYFIRST         uint32 = 0x0100 // 按键消息的第一个值.
	WM_MOUSEFIRST       uint32 = 0x0200 // 鼠标消息的第一个值.
	WM_KEYLAST          uint32 = 0x0109 // 按键消息的最后一个值.
	WM_MOUSELAST        uint32 = 0x020E // 鼠标消息的最后一个值.
	WM_SYSCOMMAND       uint32 = 0x0112 // 系统命令消息.
	WM_WINDOWPOSCHANGED uint32 = 0x0047 // 窗口位置改变消息.
)
View Source
const (
	SC_SIZE               = 0xF000 // 调整窗口大小
	SC_MOVE               = 0xF010 // 移动窗口
	SC_MINIMIZE           = 0xF020 // 最小化窗口
	SC_MAXIMIZE           = 0xF030 // 最大化窗口
	SC_NEXTWINDOW         = 0xF040 // 切换到下一个窗口
	SC_PREVWINDOW         = 0xF050 // 切换到上一个窗口
	SC_CLOSE              = 0xF060 // 关闭窗口
	SC_VSCROLL            = 0xF070 // 垂直滚动
	SC_HSCROLL            = 0xF080 // 水平滚动
	SC_MOUSEMENU          = 0xF090 // 鼠标菜单
	SC_KEYMENU            = 0xF100 // 键盘菜单
	SC_ARRANGE            = 0xF110 // 排列窗口
	SC_RESTORE            = 0xF120 // 恢复窗口
	SC_TASKLIST           = 0xF130 // 任务列表
	SC_SCREENSAVE         = 0xF140 // 屏幕保护程序
	SC_HOTKEY             = 0xF150 // 热键
	SC_DEFAULT            = 0xF160 // 默认操作
	SC_MONITORPOWERuint32 = 0xF170 // 显示器电源设置
	SC_CONTEXTHELP        = 0xF180 // 上下文帮助
	SC_SEPARATOR          = 0xF00F // 分隔符
)

系统菜单命令值常量

View Source
const (
	ICON_BIG   = 1 // 大图标
	ICON_SMALL = 0 // 小图标
)
View Source
const (
	SIZE_RESTORED  = iota // 0: 窗口恢复(正常大小)
	SIZE_MINIMIZED        // 1: 窗口最小化(任务栏)
	SIZE_MAXIMIZED        // 2: 窗口最大化(全屏)
	SIZE_MAXSHOW          // 3: 其他窗口最大化时触发显示(如任务栏自动隐藏)
	SIZE_MAXHIDE          // 4: 其他窗口最大化时触发隐藏(如任务栏自动隐藏)
)

WM_SIZE 消息的 wParam 值

View Source
const (
	WA_INACTIVE    = 0 // 窗口被停用(非活动状态)
	WA_ACTIVE      = 1 // 窗口被激活(例如通过键盘切换)
	WA_CLICKACTIVE = 2 // 窗口通过鼠标点击激活
)

WM_ACTIVATE 消息的窗口激活状态值(对应 wParam)

View Source
const (
	KF_EXTENDED = 0x0100 // 扩展键(如右侧Alt/Ctrl/方向键)
	KF_DLGMODE  = 0x0800 // 对话框激活状态下的按键
	KF_MENUMODE = 0x1000 // 菜单激活状态下的按键
	KF_ALTDOWN  = 0x2000 // Alt键被按住
	KF_REPEAT   = 0x4000 // 重复按键计数标志
	KF_UP       = 0x8000 // 按键释放事件(用于 WM_KEYUP)
)

WM_KEYUP, WM_KEYDOWN, WM_CHAR 消息的 lParam 高位标志(HIWORD)

View Source
const (
	LLKHF_EXTENDED          = 0x0001 // 扩展键标志 (如右Alt/Ctrl)
	LLKHF_INJECTED          = 0x0010 // 事件由其他进程注入
	LLKHF_ALTDOWN           = 0x0020 // Alt键按下状态
	LLKHF_UP                = 0x0080 // 按键释放事件
	LLKHF_LOWER_IL_INJECTED = 0x0002 // 低完整性进程注入事件
)

低级键盘钩子标志 (KBDLLHOOKSTRUCT.flags)

View Source
const (
	MCI_NOTIFY_SUCCESSFUL uint32 = 0x0001 // 命令成功完成
	MCI_NOTIFY_SUPERSEDED uint32 = 0x0002 // 命令被另一个命令取代
	MCI_NOTIFY_ABORTED    uint32 = 0x0004 // 命令被用户中止
	MCI_NOTIFY_FAILURE    uint32 = 0x0008 // 命令失败
)

MCI 设备通知状态, 在 wParam 参数中

View Source
const MM_MCINOTIFY uint32 = 0x3B9

MM_MCINOTIFY MCI 设备通知消息

View Source
const (
	TOUCH_FLAG_NONE uint32 = 0x00000000 // 默认
)
View Source
const WHEEL_DELTA int16 = 120

WHEEL_DELTA 一次标准滚轮滚动的增量.

Variables

View Source
var (
	// Comdlg32 提供标准对话框功能,例如“打开文件”、“保存文件”、“选择字体”和“选择颜色”等公共对话框。
	Comdlg32 = syscall.NewLazyDLL("comdlg32.dll")
)
View Source
var (
	// Gdi32 是 Windows 操作系统中的核心图形接口,负责所有图形和字体的屏幕显示与打印输出。
	Gdi32 = syscall.NewLazyDLL("gdi32.dll")
)
View Source
var (
	// Kernel32 为应用程序提供最基础的操作系统功能,如内存管理、进程/线程控制、文件输入输出等底层系统服务。
	Kernel32 = syscall.NewLazyDLL("kernel32.dll")
)
View Source
var (
	// Ntdll 是为运行在用户模式的应用程序提供访问操作系统内核(执行系统调用)和底层系统服务的接口。
	Ntdll = syscall.NewLazyDLL("ntdll.dll")
)
View Source
var (
	// Ole32 是 Windows 系统中实现对象链接与嵌入、COM 和 ActiveX 技术的核心组件,用于支持应用程序间的数据交换与复合文档处理。
	Ole32 = syscall.NewLazyDLL("ole32.dll")
)
View Source
var (
	// Shell32 负责提供图形用户界面(尤其是桌面、文件资源管理器等“Shell”外壳)的绝大部分功能、常用系统对话框以及大量系统 API 函数。
	Shell32 = syscall.NewLazyDLL("shell32.dll")
)
View Source
var (
	// Shlwapi 是 Windows 操作系统中提供 Shell 轻量级 API 的动态链接库,主要用于处理字符串、文件路径和注册表操作等基础功能.
	Shlwapi = syscall.NewLazyDLL("shlwapi")
)
View Source
var (
	// User32 负责管理用户界面相关的基本功能,如窗口的创建、显示、消息处理和用户输入(鼠标、键盘)的响应。
	User32 = syscall.NewLazyDLL("user32.dll")
)
View Source
var (
	// Winmm 是 Windows 系统中负责音频播放、录音、MIDI 音乐控制等多媒体功能的核心组件。
	Winmm = syscall.NewLazyDLL("winmm.dll")
)

Functions

func AdjustWindowRect added in v1.3.395

func AdjustWindowRect(lpRect *xc.RECT, dwStyle xcc.WS_, bMenu bool) bool

AdjustWindowRect 计算窗口矩形的所需大小,以便客户区域具有指定的大小。返回的窗口矩形用于传递给 CreateWindowEx 函数来创建具有指定客户区域大小的窗口。

lpRect: 指向 xc.RECT 结构的指针,该结构包含客户区域所需的大小。返回时,结构包含窗口所需的大小。

dwStyle: 要创建的窗口的窗口样式。此参数可以是以下值的组合:xcc.WS_ . 不能指定 xcc.WS_OVERLAPPED 样式。

bMenu: 指示窗口是否有菜单。

https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-AdjustWindowRect.

func CallNextHookEx added in v1.3.391

func CallNextHookEx(hhk uintptr, nCode int32, wParam, lParam uintptr) uintptr

CallNextHookEx 将挂钩信息传递给当前挂钩链中的下一个挂钩过程。挂钩过程可以在处理挂钩信息之前或之后调用此函数.

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-callNextHookEx.

hhk: 忽略此参数. 可填0.

nCode: 传递给当前挂钩过程的挂钩代码。下一个挂钩过程使用此代码来确定如何处理挂钩信息.

wParam: 传递给当前挂钩过程的 wParam 值。此参数的含义取决于与当前挂钩链关联的挂钩类型.

lParam: 传递给当前挂钩过程的 lParam 值。此参数的含义取决于与当前挂钩链关联的挂钩类型.

返回值: 此值由链中的下一个挂钩过程返回。当前挂钩过程还必须返回此值。返回值的含义取决于挂钩类型。有关详细信息,请参阅各个挂钩过程的说明.

func ChooseColorW

func ChooseColorW(lpcc *ChooseColor) bool

ChooseColorW 创建一个颜色对话框,使用户能够选择一种颜色.

详情: https://docs.microsoft.com/zh-cn/previous-versions/windows/desktop/legacy/ms646912(v=vs.85).

lpcc: 指向 wapi.ChooseColor 结构的指针,该结构包含用于初始化对话框的信息。当函数返回时,此结构包含有关用户颜色选择的信息.

Example
package main

import (
	"fmt"
	"unsafe"

	"github.com/twgh/xcgui/wapi"
)

func main() {
	var lpCustColors [16]uint32
	cc := wapi.ChooseColor{
		LStructSize:    36,
		HwndOwner:      0,
		HInstance:      0,
		RgbResult:      0,
		LpCustColors:   &lpCustColors[0],
		Flags:          wapi.CC_FULLOPEN, // 默认打开自定义颜色
		LCustData:      0,
		LpfnHook:       0,
		LpTemplateName: 0,
	}
	cc.LStructSize = uint32(unsafe.Sizeof(cc))
	ret := wapi.ChooseColorW(&cc)
	fmt.Println(ret)
	fmt.Println(cc.RgbResult) // rgb颜色
	fmt.Println(lpCustColors) // 如果你添加了自定义颜色, 会保存在这个数组里面, 然后只要这个数组还在, 再次打开选择颜色界面时, 之前添加的自定义颜色还会存在
}

func ClientToScreen

func ClientToScreen(hWnd uintptr, lpPoint *POINT) bool

ClientToScreen 将指定点的客户区坐标转换为屏幕坐标.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-ClientToScreen.

hWnd: 窗口真实句柄.

lpPoint: wapi.POINT 指针. 如果函数成功,则将新的屏幕坐标复制到此结构中.

Example
package main

import (
	"fmt"

	"github.com/twgh/xcgui/app"
	"github.com/twgh/xcgui/wapi"
	"github.com/twgh/xcgui/window"
	"github.com/twgh/xcgui/xcc"
)

func main() {
	app.InitOrExit()
	a := app.New(true)
	a.EnableAutoDPI(true).EnableDPI(true)
	w := window.New(0, 0, 300, 300, "", 0, xcc.Window_Style_Default)

	pt := wapi.POINT{X: 0, Y: 0}
	wapi.ClientToScreen(w.GetHWND(), &pt)
	fmt.Println(pt)

	a.ShowAndRun(w.Handle)
	a.Exit()
}

func CloseClipboard

func CloseClipboard() bool

CloseClipboard 关闭剪贴板.

  • 当窗口完成检查或更改剪贴板时,通过调用 CloseClipboard 关闭剪贴板。这使其他窗口能够访问剪贴板.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-CloseClipboard.

func CloseHandle

func CloseHandle(handle uintptr) bool

CloseHandle 关闭一个内核对象.

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/handleapi/nf-handleapi-closehandle.

handle: 对象句柄.

func CoCreateInstance added in v1.3.395

func CoCreateInstance(rclsid, pUnkOuter unsafe.Pointer, dwClsContext uint32, riid unsafe.Pointer) (unsafe.Pointer, syscall.Errno)

CoCreateInstance 创建并默认初始化与指定 CLSID 关联的类的单个对象。

rclsid: 要创建的对象的 CLSID。

pUnkOuter: 如果为 NULL,则指示对象不是作为聚合的一部分创建的。 如果不是 NULL,则指向聚合对象的 IUnknown 接口的指针 (控制 IUnknown) 。

dwClsContext: 管理新创建对象的代码将在其中运行的上下文。这些值取自枚举 CLSCTX。

riid: 要用于与对象通信的接口的 IID。

ppv: 指向接口指针变量的指针。如果创建成功,*ppv 包含请求的接口指针。

返回: S_OK 表示成功,其他值表示失败。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/combaseapi/nf-combaseapi-cocreateinstance

func CoInitializeEx added in v1.3.395

func CoInitializeEx(pvReserved uintptr, dwCoInit COINIT_) syscall.Errno

CoInitializeEx 初始化 COM 库供调用线程使用,设置线程的并发模型,并根据需要为线程创建新的单元。

pvReserved: 保留参数, 必须为0.

dwCoInit: 线程的并发模型和初始化选项, 可以是以下值的组合: wapi.COINIT_ .

  • 默认值为 COINIT_MULTITHREADED.
  • 不能同时设置 COINIT_APARTMENTTHREADED 和 COINIT_MULTITHREADED 标志。

返回: S_OK, S_FALSE, E_INVALIDARG, E_OUTOFMEMORY, E_UNEXPECTED, RPC_E_CHANGED_MODE.

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/combaseapi/nf-combaseapi-coinitializeex.

func CoTaskMemFree added in v1.3.395

func CoTaskMemFree(pv unsafe.Pointer)

CoTaskMemFree 释放由 COM 任务内存分配器分配的内存块。

pv: 指向要释放的内存块的指针。如果为 NULL,则函数不执行任何操作。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/combaseapi/nf-combaseapi-cotaskmemfree

func CommDlgExtendedError added in v1.3.393

func CommDlgExtendedError() uint32

CommDlgExtendedError 返回常见对话框错误代码。此代码指示执行其中一个常见对话框函数期间发生的最新错误。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/commdlg/nf-commdlg-commdlgextendederror.

func CreateIconFromResource added in v1.3.381

func CreateIconFromResource(presbits uintptr, dwResSize uint32, fIcon bool, dwVer uint32) (uintptr, error)

CreateIconFromResource 从描述图标的资源位创建图标或光标。若要指定所需的高度或宽度,请使用 CreateIconFromResourceEx 函数.

  • 使用完图标后,请使用 DestroyIcon 函数销毁它.

详见: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-createiconfromresource.

presbits: 包含图标或游标资源位的 DWORD 对齐缓冲区指针。通常通过调用 LookupIconIdFromDirectory、 LookupIconIdFromDirectoryEx 和 LoadResource 函数来加载这些位.

dwResSize: 参数指向的位集的大小(以字节为单位).

fIcon: 指示是要创建图标还是游标。 如果此参数为 TRUE,则创建图标。 如果为 FALSE,则创建游标。LOCALHEADER 结构定义游标热点,是从游标资源位读取的第一个数据.

dwVer: presbits 参数指向的资源位的图标或光标格式的版本号。 该值必须大于或等于 0x00020000 且小于或等于 0x00030000。 此参数通常设置为 0x00030000.

返回值: HICON句柄.

func CreateRoundRectRgn added in v1.3.395

func CreateRoundRectRgn(left, top, right, bottom, width, height int32) uintptr

CreateRoundRectRgn 创建具有圆角的矩形区域, 返回区域句柄。

left, top, right, bottom: 指定矩形的边界坐标。

width, height: 指定椭圆的宽度和高度,用于创建圆角。

https://learn.microsoft.com/zh-cn/windows/win32/api/wingdi/nf-wingdi-createroundrectrgn

func CreateWindowEx added in v1.3.394

func CreateWindowEx(exStyle xcc.WS_EX_, className, windowName string, style xcc.WS_, x, y, nWidth, nHeight int32, hWndParent uintptr, hMenu uintptr, hInstance uintptr, lpParam uintptr) uintptr

CreateWindowEx 创建具有扩展窗口样式的重叠、弹出窗口或子窗口; 否则,此函数与 CreateWindow 函数相同。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-CreateWindowExW.

exStyle: 窗口的扩展样式。 此参数可以是以下值的组合:xcc.WS_EX_ .

className: 类名。

windowName: 窗口名称。

style: 窗口的样式。 此参数可以是以下值的组合:xcc.WS_ .

x: 窗口的初始水平位置。 对于重叠窗口或弹出窗口,x 参数是窗口左上角的初始 x 坐标,以屏幕坐标表示。 对于子窗口,x 是窗口左上角相对于父窗口工作区左上角的 x 坐标。 如果 x 设置为 CW_USEDEFAULT, 系统将选择窗口左上角的默认位置,并忽略 y 参数。 CW_USEDEFAULT 仅适用于重叠窗口; 如果为弹出窗口或子窗口指定,则 x 和 y 参数设置为零。

y: 窗口的初始垂直位置。 对于重叠窗口或弹出窗口,y 参数是窗口左上角的初始 y 坐标,以屏幕坐标表示。 对于子窗口,y 是子窗口左上角相对于父窗口工作区左上角的初始 y 坐标。 对于列表框 y 是列表框工作区左上角相对于父窗口工作区左上角的初始 y 坐标。如果使用 WS_VISIBLE 样式位设置创建重叠窗口,并将 x 参数设置为 CW_USEDEFAULT,则 y 参数将确定窗口的显示方式。 如果 y 参数 CW_USEDEFAULT,则窗口管理器会在创建窗口后使用 SW_SHOW 标志调用 ShowWindow。 如果 y 参数是一些其他值,则窗口管理器会调用 ShowWindow,该值作为 nCmdShow 参数。

nWidth: 窗口的宽度(以设备单位为单位)。 对于重叠窗口,nWidth 是窗口的宽度、屏幕坐标或 CW_USEDEFAULT。 如果 nWidth 为 CW_USEDEFAULT,则系统会选择窗口的默认宽度和高度;默认宽度从初始 x 坐标扩展到屏幕右边缘;默认高度从初始 y 坐标扩展到图标区域的顶部。 CW_USEDEFAULT 仅适用于重叠窗口;如果为弹出窗口或子窗口指定了 CW_USEDEFAULT,则 nWidth,nHeight 参数设置为零。

nHeight: 窗口的高度(以设备单位为单位)。 对于重叠窗口,nHeight 是窗口的高度(以屏幕坐标为单位)。 如果 nWidth 参数设置为 CW_USEDEFAULT,则系统将忽略 nHeight 。

hWndParent: 正在创建的窗口的父窗口或所有者窗口的句柄。 若要创建子窗口或拥有的窗口,请提供有效的窗口句柄。 对于弹出窗口,此参数是可选的。

hMenu; 菜单的句柄,或指定子窗口标识符,具体取决于窗口样式。 对于重叠或弹出窗口,hMenu 标识要与窗口一起使用的菜单;如果要使用类菜单,它可以 NULL。 对于子窗口,hMenu 指定子窗口标识符,这是对话框控件用来通知其父级事件的整数值。 应用程序确定子窗口标识符;对于具有相同父窗口的所有子窗口,它必须是唯一的。

hInstance: 要与窗口关联的模块实例的句柄。

lpParam: 指向通过 CREATESTRUCT 结构(lpCreateParams 成员)指向的值的指针,该参数由 WM_CREATE 消息的 lParam 参数指向。 此消息在返回之前由此函数发送到创建的窗口。如果应用程序调用 CreateWindow 来创建 MDI 客户端窗口,lpParam 应指向 CLIENTCREATESTRUCT 结构。 如果 MDI 客户端窗口调用 CreateWindow 创建 MDI 子窗口,lpParam 应指向 MDICREATESTRUCT 结构。 如果不需要其他数据,lpParam 可能会 NULL。

func DefWindowProc added in v1.3.394

func DefWindowProc(hWnd uintptr, Msg uint32, wParam, lParam uintptr) uintptr

DefWindowProc 调用默认窗口过程,为应用程序未处理的任何窗口消息提供默认处理。此函数可确保处理每个消息。返回值是消息处理的结果,取决于消息。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-DefWindowProcW.

hWnd: 接收消息的窗口过程的句柄。

Msg: 消息。

wParam: 消息的附加参数。

lParam: 消息的附加参数。

func DestroyIcon added in v1.3.382

func DestroyIcon(hIcon uintptr) bool

DestroyIcon 销毁图标并释放图标占用的任何内存.

  • 只需为使用以下函数创建的图标和游标调用 DestroyIcon : CreateIconFromResourceEx (如果调用时没有 LR_SHARED 标志) 、 CreateIconIndirect 和 CopyIcon。 请勿使用此函数销毁共享图标。 只要从中加载共享图标的模块保留在内存中,共享图标就有效.

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-destroyicon.

hIcon: 要销毁的图标的句柄。 图标不得处于使用中.

func DestroyWindow added in v1.3.394

func DestroyWindow(hwnd uintptr) bool

DestroyWindow 销毁指定的窗口。 函数将 WM_DESTROY 和 WM_NCDESTROY 消息发送到窗口,以停用窗口并从窗口中删除键盘焦点。 如果窗口位于查看器链) 的顶部,函数还会销毁窗口的菜单、销毁计时器、删除剪贴板所有权,并中断剪贴板查看器链 。

  • 如果指定的窗口是父窗口或所有者窗口, 则 DestroyWindow 会在销毁父窗口或所有者窗口时自动销毁关联的子窗口或拥有窗口。 函数首先销毁子窗口或拥有的窗口,然后销毁父窗口或所有者窗口。
  • DestroyWindow 还会销毁 CreateDialog 函数创建的无模式对话框。

hwnd: 要检索其上级窗口的句柄。 如果此参数是桌面窗口,则该函数返回 NULL。

https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-DestroyWindow.

func DispatchMessage added in v1.3.360

func DispatchMessage(pMsg *MSG) int

DispatchMessage 向窗口过程发送消息。它通常用于发送由 GetMessage 函数检索到的消息.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-DispatchMessageW.

pMsg: 指向包含消息的结构的指针.

返回值: 返回值指定窗口过程返回的值。尽管它的含义取决于所发送的消息,但返回值通常会被忽略.

func DragFinish

func DragFinish(hDrop uintptr)

DragFinish 释放系统分配用于将文件名传输到应用程序的内存.

详情: https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-DragFinish.

hDrop: 句柄.

func DragQueryFileW

func DragQueryFileW(hDrop uintptr, iFile uint32, lpszFile *string, cch uint32) int

DragQueryFileW 检索由成功的拖放操作产生的文件路径.

详情: https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-DragQueryFileW.

hDrop: 句柄.

iFile: 文件索引.

lpszFile: 返回的文件路径.

cch: 接收的文件路径的字符数, 通常为260.

返回值: 返回文件路径的字符数.

func DragQueryPoint

func DragQueryPoint(hDrop uintptr, ppt *xc.POINT) bool

DragQueryPoint 检索在拖放文件时鼠标指针的位置.

详情: https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-DragQueryPoint.

hDrop: 句柄.

ppt: 接收鼠标指针的坐标.

返回值: 如果拖放发生在窗口的客户区, 返回true;否则返回false.

func EmptyClipboard

func EmptyClipboard() bool

EmptyClipboard 清空剪贴板并释放剪贴板中数据的句柄。然后该函数将剪贴板的所有权分配给当前打开剪贴板的窗口.

  • 在调用 EmptyClipboard 之前,应用程序必须使用 OpenClipboard 函数打开剪贴板.
  • 如果应用程序在打开剪贴板时指定了0窗口句柄,则 EmptyClipboard 会成功,但会将剪贴板所有者设置为NULL。请注意,这会导致 SetClipboardData 失败.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-EmptyClipboard.

func EnumWindows added in v1.3.394

func EnumWindows(lpEnumFunc uintptr, lParam uintptr) bool

EnumWindows 通过将句柄传递到每个窗口,进而将传递给应用程序定义的回调函数,枚举屏幕上的所有顶级窗口。

  • 枚举窗口 将一直持续到最后一个顶级窗口被枚举或回调函数返回 FALSE。
  • EnumWindows 函数不枚举子窗口,但系统拥有的几个具有 WS_CHILD 样式的顶级窗口除外。
  • 此函数比在循环中调用 GetWindow 函数更可靠。 调用 GetWindow 以执行此任务的应用程序有被捕获到无限循环或引用已销毁窗口的句柄的风险。
  • 如果 EnumWindowsProc 返回零,则返回值也为零。 在这种情况下,回调函数应调用 SetLastError 以获取要返回到 EnumWindows 调用方有意义的错误代码。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-EnumWindows.

lpEnumFunc: 指向应用程序定义的回调函数的指针。使用 syscall.NewCallback 生成. 格式: func (hwnd, lParam uintptr) uintptr {return 1}, return 0 可立刻终止.

lParam: 要传递给回调函数的应用程序定义值。

func EnumWindowsEx added in v1.3.394

func EnumWindowsEx(EnumWindowsProc func(hwnd, lParam uintptr) uintptr, lParam uintptr) bool

EnumWindowsEx 通过将句柄传递到每个窗口,进而将传递给应用程序定义的回调函数,枚举屏幕上的所有顶级窗口。

  • 枚举窗口 将一直持续到最后一个顶级窗口被枚举或回调函数返回 FALSE。
  • EnumWindowsEx 函数不枚举子窗口,但系统拥有的几个具有 WS_CHILD 样式的顶级窗口除外。
  • 此函数比在循环中调用 GetWindow 函数更可靠。 调用 GetWindow 以执行此任务的应用程序有被捕获到无限循环或引用已销毁窗口的句柄的风险。
  • 如果 EnumWindowsProc 返回零,则返回值也为零。 在这种情况下,回调函数应调用 SetLastError 以获取要返回到 EnumWindowsEx 调用方有意义的错误代码。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-EnumWindows.

EnumWindowsProc: 回调函数. return 0 可立刻终止. return 1 继续枚举.

lParam: 要传递给回调函数的应用程序定义值。

func FindWindowExW

func FindWindowExW(hWndParent, hWndChildAfter uintptr, lpszClass, lpszWindow string) uintptr

FindWindowExW 检索类名称和窗口名称与指定字符串匹配的窗口的句柄. 该函数搜索子窗口,从指定子窗口后面的那个开始. 此函数不执行区分大小写的搜索.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-FindWindowExW.

hWndParent: 要搜索其子窗口的父窗口的句柄. 如果hwndParent为0,该函数使用桌面窗口作为父窗口. 该函数在作为桌面子窗口的窗口中进行搜索.

hWndChildAfter: 子窗口的句柄。搜索从 Z 顺序中的下一个子窗口开始。子窗口必须是hwndParent的直接子窗口,而不仅仅是后代窗口。 如果hwndChildAfter为0,则搜索从hwndParent的第一个子窗口开始。 请注意,如果hwndParent和hwndChildAfter都是0,则该函数将搜索所有顶级和仅消息窗口.

lpszClass: 窗口类名, 可空.

lpszWindow: 窗口名称(窗口的标题), 可空.

Example
package main

import (
	"fmt"

	"github.com/twgh/xcgui/wapi"
)

func main() {
	fmt.Println(wapi.FindWindowExW(0, 0, "", "任务管理器"))
	fmt.Println(wapi.FindWindowExW(0, 0, "TaskManagerWindow", ""))
	fmt.Println(wapi.FindWindowExW(0, 0, "TaskManagerWindow", "任务管理器"))
}

func FindWindowW added in v1.3.381

func FindWindowW(lpClassName, lpWindowName string) uintptr

FindWindowW 检索顶级窗口的句柄,该窗口的类名称和窗口名称与指定的字符串匹配。 此函数不搜索子窗口。 此函数不执行区分大小写的搜索.

  • 如果 lpWindowName 参数不为空, FindWindowW 将调用 GetWindowTextW 函数以检索窗口名称进行比较。 有关可能出现的潜在问题的说明,请参阅 GetWindowTextW 的备注.

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-FindWindowW.

lpClassName: 窗口类名, 可为空.

lpWindowName: 窗口名称(窗口的标题), 可为空.

返回值: 返回窗口句柄.

func GetAncestor added in v1.3.394

func GetAncestor(hwnd uintptr, gaFlags GA_) uintptr

GetAncestor 检索指定窗口的上级句柄。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-GetAncestor.

hwnd: 要检索其上级窗口的句柄。 如果此参数是桌面窗口,则该函数返回 NULL。

gaFlags: 要检索的上级。 此参数的取值可为下列值之一:wapi.GA_ .

func GetAsyncKeyState added in v1.3.395

func GetAsyncKeyState(vKey int32) int16

GetAsyncKeyState 确定在调用此函数时是否按下了键,以及自上次调用 GetAsyncKeyState 以来是否按下了该键。

  • 如果在调用此函数时按下了键,则返回值的最高位位于位置 1。
  • 如果自上次调用 GetAsyncKeyState 以来按下了该键,则返回值的最低有效位设置为 1。
  • 如果在调用此函数时未按下该键,则返回值为零。
  • 如果自上次调用 GetAsyncKeyState 以来未按下该键,则返回值为零。

vKey: 虚拟键码。有关代码的列表,请参阅虚拟键码: xcc.VK_ .

返回值: 如果函数成功,则返回值指定最高位和最低有效位的状态。如果函数失败,则返回值为零。要获取扩展错误信息,请调用 GetLastError。

https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-getasynckeystate

func GetClassName added in v1.3.394

func GetClassName(hWnd uintptr, lpClassName *string, nMaxCount int) int

GetClassName 检索指定窗口所属的类的名称。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-GetClassName.

hWnd: 窗口的句柄,以及窗口所属的类的间接句柄。

lpClassName: 类名字符串。

nMaxCount: lpClassName 缓冲区的长度(以字符为单位)。

  • 缓冲区必须足够大,才能包含终止 null 字符; 否则,类名字符串将被截断为 nMaxCount-1 字符。

返回值:

  • 如果函数成功,则返回值是复制到缓冲区的字符数,不包括终止 null 字符。
  • 如果函数失败,则返回值为零。

func GetClientRect added in v1.3.395

func GetClientRect(hWnd uintptr, lpRect *xc.RECT) bool

GetClientRect 检索指定窗口客户区的坐标。客户区是整个窗口的工作区,不包括标题栏、菜单栏和滚动条。 左上角坐标总是(0,0)。右下角坐标指定客户区的宽度和高度。

hWnd: 要获取其客户区坐标的窗口句柄。

lpRect: 指向 xc.RECT 结构的指针,该结构接收客户区的坐标。左上角坐标为(0,0),右下角坐标指定宽度和高度。

https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-GetClientRect.

func GetClipboardData

func GetClipboardData(uFormat CF_) uintptr

GetClipboardData 从剪贴板中检索指定格式的数据。剪贴板必须先前已打开.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-GetClipboardData.

uFormat: 剪贴板格式, wapi.CF_ .

返回值: 如果函数成功,则返回值是指定格式的剪贴板对象的句柄. 如果函数失败,则返回值为0.

func GetCurrentProcessId added in v1.3.394

func GetCurrentProcessId() uint32

GetCurrentProcessId 检索调用进程的进程标识符。在进程终止之前,进程标识符将在整个系统中唯一标识进程。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/libloaderapi/nf-libloaderapi-GetCurrentProcessId.

func GetCurrentThreadId added in v1.3.395

func GetCurrentThreadId() uint32

GetCurrentThreadId 检索调用线程的线程标识符。在线程终止之前,线程标识符将在整个系统中唯一标识线程。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/processthreadsapi/nf-processthreadsapi-getcurrentthreadid

func GetCursorPos added in v1.3.352

func GetCursorPos(lpPoint *POINT) bool

GetCursorPos 检索鼠标光标的位置,以屏幕坐标表示.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-getcursorpos.

lpPoint: 指向接收光标屏幕坐标的 wapi.POINT 结构的指针.

Example
package main

import (
	"fmt"

	"github.com/twgh/xcgui/wapi"
)

func main() {
	var pt wapi.POINT
	wapi.GetCursorPos(&pt)
	fmt.Println(pt)
}

func GetDesktopWindow

func GetDesktopWindow() uintptr

GetDesktopWindow 获取桌面窗口的句柄.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-GetDesktopWindow.

func GetLastError added in v1.3.360

func GetLastError() int32

GetLastError 检索调用线程的最后一个错误代码值。最后一个错误代码是在每个线程的基础上维护的。多个线程不会覆盖彼此的最后一个错误代码.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-GetLastError.

返回值: 返回值是调用线程的最后一个错误代码.

func GetMessage added in v1.3.360

func GetMessage(pMsg *MSG, hWnd uintptr, wMsgFilterMin uint32, wMsgFilterMax uint32) int32

GetMessage 从调用线程的消息队列中检索消息。应用程序通常使用返回值来确定是否结束主消息循环并退出程序。该函数分派传入的已发送消息,直到发布的消息可用于检索。 与 GetMessage 不同, PeekMessage 函数在返回之前不会等待消息发布.

pMsg: 指向从线程的消息队列接收消息信息的 MSG 结构的指针.

hWnd: 要检索其消息的窗口的句柄。窗口必须属于当前线程。

  • 如果 hWnd 为0, GetMessage 检索属于当前线程的任何窗口的消息,以及当前线程的消息队列中 hwnd 值为0的任何消息(参见 MSG 结构)。因此,如果 hWnd 为0,则同时处理窗口消息和线程消息。
  • 如果 hWnd 为-1, GetMessage 仅检索当前线程的消息队列中 hwnd 值为0的消息,即 PostMessageW (当 hWnd 参数为0时)或 PostThreadMessage 发布的线程消息.

wMsgFilterMin: 要检索的最低消息值的整数值。使用 WM_KEYFIRST (0x0100) 指定第一条键盘消息或 WM_MOUSEFIRST (0x0200) 指定第一条鼠标消息.

wMsgFilterMax: 要检索的最高消息值的整数值。使用 WM_KEYLAST 指定最后一个键盘消息或 WM_MOUSELAST 指定最后一个鼠标消息.

返回值: 如果函数检索到 WM_QUIT 以外的消息,则返回值非0。如果函数检索到 WM_QUIT 消息,则返回值为0。如果有错误,返回值为-1.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-GetMessageW.

func GetModuleHandleEx added in v1.3.394

func GetModuleHandleEx(dwFlags GET_MODULE_HANDLE_EX_FLAG_, lpModuleName string) uintptr

GetModuleHandleEx 检索调用进程的进程标识符。在进程终止之前,进程标识符将在整个系统中唯一标识进程。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/libloaderapi/nf-libloaderapi-GetModuleHandleExW.

dwFlags: 此参数可以是零个或以下一个或多个值: wapi.GET_MODULE_HANDLE_EX_FLAG_。如果模块的引用计数递增,调用方必须使用 FreeLibrary 函数在不再需要模块句柄时递减引用计数。

lpModuleName: 使用 common.StrPtr 生成. 加载的模块的名称(.dll 或 .exe 文件),或模块中的地址(如果 dwFlags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS)。

  • 对于模块名称,如果省略文件扩展名,则会追加默认库扩展名 .dll。 文件名字符串可以包含尾随点字符 (.),以指示模块名称没有扩展名。 该字符串不必指定路径。 指定路径时,请务必使用反斜杠(\),而不是正斜杠(/)。 名称与当前映射到调用进程的地址空间的模块的名称进行比较(大小写)。
  • 如果此参数为空,则该函数将返回用于创建调用进程的文件的句柄(.exe 文件)。
  • GetModuleHandleEx 函数不会检索使用 LOAD_LIBRARY_AS_DATAFILE 标志加载的模块的句柄。

func GetModuleHandleW added in v1.3.381

func GetModuleHandleW(lpModuleName string) uintptr

GetModuleHandleW 检索指定模块的模块句柄。 模块必须已由调用进程加载.

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/libloaderapi/nf-libloaderapi-getmodulehandlew.

lpModuleName: 加载的模块的名称 (.dll 或 .exe 文件). 如果省略文件扩展名,则会追加默认库扩展名 .dll。 文件名字符串可以包含尾随点字符 (.) ,以指示模块名称没有扩展名。 字符串不必指定路径。 指定路径时,请务必使用反斜杠 (\) ,而不是使用 /) (正斜杠。 名称 (大小写独立比较,) 当前映射到调用进程的地址空间的模块的名称。如果此参数为空, 则 GetModuleHandleW 返回用于创建调用进程 (.exe 文件) 的文件的句柄.

func GetOpenFileNameW

func GetOpenFileNameW(unnamedParam1 *OpenFileNameW) bool

GetOpenFileNameW 创建一个打开对话框,让用户指定要打开的文件或文件集的驱动器、目录和名称.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/commdlg/nf-commdlg-getopenfilenamew.

unnamedParam1: 指向包含用于初始化对话框的信息的 wapi.OpenFileNameW 结构的指针。当函数返回时,此结构包含有关用户文件选择的信息.

func GetParent added in v1.3.394

func GetParent(hWnd uintptr) uintptr

GetParent 检索指定窗口的父级或所有者的句柄。若要检索指定上级的句柄,请使用 GetAncestor 函数。

  • 如果窗口是子窗口,则返回值是父窗口的句柄。 如果窗口是具有 WS_POPUP 样式的顶级窗口,则返回值是所有者窗口的句柄。
  • 如果函数失败,则返回值为 NULL。 要获得更多的错误信息,请调用 GetLastError。
  • 此函数通常由于以下原因之一而失败:1. 该窗口是无所有者或没有 WS_POPUP 样式的顶级窗口。2. 所有者窗口具有 WS_POPUP 样式。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-GetParent.

hWnd: 要检索其父窗口句柄的窗口的句柄。

func GetSaveFileNameW

func GetSaveFileNameW(unnamedParam1 *OpenFileNameW) bool

GetSaveFileNameW 创建一个保存对话框,让用户指定要保存的文件的驱动器、目录和名称.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/commdlg/nf-commdlg-GetSaveFileNameW.

unnamedParam1: 指向包含用于初始化对话框的信息的 wapi.OpenFileNameW 结构的指针。当函数返回时,此结构包含有关用户文件选择的信息.

func GetSystemMetrics added in v1.3.394

func GetSystemMetrics(nIndex SM_) int32

GetSystemMetrics 检索指定的系统指标或系统配置设置。检索的所有维度都以像素为单位。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-GetSystemMetrics.

nIndex: 要检索的系统指标或配置设置。 此参数的取值可为下列值之一:wapi.SM_ . 请注意: 所有SM_CX* 值为宽度,所有SM_CY* 值为高度。

func GetWindowLongPtrW added in v1.3.393

func GetWindowLongPtrW(hWnd uintptr, nIndex int32) int

GetWindowLongPtrW 检索有关指定窗口的信息。该函数还会在额外的窗口内存中检索指定偏移量处的值。返回指定属性的当前值。如果函数失败,返回值为 0。在 386 架构中, 内部使用的是 GetWindowLongW.

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-GetWindowLongPtrW.

hWnd: 窗口的句柄,间接地是窗口所属的类。

nIndex: 要检索的值的从零开始的偏移量。有效值介于零到额外窗口内存的字节数之间,减去 LONG_PTR 的大小。若要设置任何其他值,请指定以下值之一: wapi.GWL_ , wapi.GWLP_ . 当 hWnd 参数标识对话框时,也可以使用以下值: wapi.DWLP_ .

func GetWindowRect added in v1.3.395

func GetWindowRect(hWnd uintptr, lpRect *xc.RECT) bool

GetWindowRect 检索指定窗口的边界矩形的尺寸。 尺寸以相对于屏幕左上角的屏幕坐标提供。

hWnd: 窗口句柄。

lpRect: 指向 xc.RECT 结构的指针,该结构接收窗口左上角和右下角的屏幕坐标。

https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-GetWindowRect.

func GetWindowTextLengthW

func GetWindowTextLengthW(hWnd uintptr) int

GetWindowTextLengthW 检索指定窗口标题栏文本的长度(以字符为单位)(如果窗口有标题栏)。如果指定的窗口是控件,则该函数检索控件内文本的长度。但是无法检索另一个应用程序中编辑控件的文本长度.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-GetWindowTextLengthW.

hWnd: 窗口或控件的句柄.

返回值: 如果成功,则返回值是文本的长度(以字符为单位)。在某些情况下,此值可能大于文本的长度。如果窗口没有文本,则返回值为零.

func GetWindowTextW

func GetWindowTextW(hWnd uintptr, lpString *string, nMaxCount int) int

GetWindowTextW 将指定窗口标题栏(如果有)的文本复制到缓冲区中。如果指定的窗口是控件,则复制控件的文本。但是无法检索另一个应用程序中控件的文本.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-GetWindowTextW.

hWnd: 包含文本的窗口或控件的句柄.

lpString: 接收文本.

nMaxCount: 复制到缓冲区的最大字符数,包括空字符。如果文本超出此限制,则将其截断.

返回值:

  • 如果函数成功,则返回值是复制字符串的长度(以字符为单位),不包括终止空字符。
  • 如果窗口没有标题栏或文本,如果标题栏为空,或者窗口或控制句柄无效,则返回值为零.

func GetWindowThreadProcessId added in v1.3.394

func GetWindowThreadProcessId(hWnd uintptr) uint32

GetWindowThreadProcessId 检索创建指定窗口的线程的标识符,以及创建该窗口的进程(可选)的标识符。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-GetWindowThreadProcessId.

hWnd: 窗口句柄。

func GlobalAlloc

func GlobalAlloc(uFlags GMEM_, dwBytes uint) uintptr

GlobalAlloc 从堆中分配指定数量的字节.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-GlobalAlloc.

uFlags: 内存分配属性。如果指定为零,则默认为 GMEM_Fixed. 该参数可以是以下值中的一个或多个: wapi.GMEM_ .

dwBytes: 要分配的字节数。如果此参数为0并且uFlags参数指定 GMEM_Moveable ,则该函数返回标记为已丢弃的内存对象的句柄.

返回值: 如果函数成功,则返回值是新分配的内存对象的句柄. 如果函数失败,则返回值为0.

func GlobalFree

func GlobalFree(hMem uintptr) uintptr

GlobalFree 释放指定的全局内存对象并使其句柄无效.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-GlobalFree.

hMem: 全局内存对象的句柄. 此句柄由 GlobalAlloc 或 GlobalReAlloc 函数返回. 释放使用 LocalAlloc 分配的内存是不安全的.

返回值: 如果函数成功, 则返回值为0. 如果函数失败, 则返回值等于全局内存对象的句柄.

func GlobalLock

func GlobalLock(hMem uintptr) uintptr

GlobalLock 锁定一个全局内存对象并返回一个指向对象内存块第一个字节的指针.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-GlobalLock.

hMem: 全局内存对象的句柄。此句柄由 GlobalAlloc 或 GlobalReAlloc 函数返回.

返回值: 如果函数成功,则返回值是指向内存块第一个字节的指针. 如果函数失败,则返回值为0.

func GlobalSize

func GlobalSize(hMem uintptr) uint

GlobalSize 检索指定全局内存对象的当前大小,以字节为单位.

  • 内存块的大小可能大于分配内存时请求的大小. 要验证指定对象的内存块是否未被丢弃, 请在调用 GlobalSize 之前使用 GlobalFlags 函数.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-GlobalSize.

hMem: 全局内存对象的句柄。此句柄由 GlobalAlloc 或 GlobalReAlloc 函数返回.

返回值: 如果函数成功,则返回值是指定全局内存对象的大小,以字节为单位. 如果指定的句柄无效或对象已被丢弃,则返回值为0.

func GlobalUnlock

func GlobalUnlock(hMem uintptr) bool

GlobalUnlock 减少与使用 GMEM_Moveable 分配的内存对象关联的锁计数。此函数对使用 GMEM_Fixed 分配的内存对象没有影响.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-GlobalUnlock.

hMem: 全局内存对象的句柄。此句柄由 GlobalAlloc 或 GlobalReAlloc 函数返回.

func IsClipboardFormatAvailable

func IsClipboardFormatAvailable(uFormat CF_) bool

IsClipboardFormatAvailable 确定剪贴板是否包含指定格式的数据.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-IsClipboardFormatAvailable.

uFormat: 标准或注册的剪贴板格式, wapi.CF_ .

func IsDialogMessage added in v1.3.394

func IsDialogMessage(hDlg uintptr, lpMsg *MSG) bool

IsDialogMessage 确定消息是否适用于指定的对话框,如果是,则处理该消息。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-IsDialogMessageW.

hDlg: 对话框的句柄。

msg: 指向包含要检查的消息的 MSG 结构的指针。

func IsEqualGUID added in v1.3.395

func IsEqualGUID(guid1 *GUID, guid2 *GUID) bool

IsEqualGUID compares two GUID.

Not constant time comparison.

func IsOK added in v1.3.395

func IsOK(err error) bool

IsOK 检查错误是否为 S_OK.

  • 实际就是判断了 errors.Is(err, S_OK)

func IsOkOrPanic added in v1.3.395

func IsOkOrPanic(err error)

IsOkOrPanic 检查错误是否为 S_OK, 不是就 panic.

  • 实际就是判断了 errors.Is(err, S_OK)

func IsWindow added in v1.3.381

func IsWindow(hWnd uintptr) bool

IsWindow 判断一个窗口句柄是否有效.

  • 线程不应将 IsWindow 用于未创建的窗口,因为调用此函数后可能会销毁该窗口。 此外,由于窗口句柄被回收,句柄甚至可以指向其他窗口.

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-iswindow.

hWnd: 要测试的窗口的句柄.

func IsWindowVisible added in v1.3.394

func IsWindowVisible(hWnd uintptr) bool

IsWindowVisible 确定指定窗口的可见性状态。

  • 如果指定的窗口、其父窗口等具有 WS_VISIBLE 样式,则返回值为非零。 否则返回值为零。
  • 由于返回值指定窗口是否具有 WS_VISIBLE 样式,因此即使窗口被其他窗口完全遮挡,也可能为非零。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-IsWindowVisible.

hWnd: 窗口的句柄。

func LoadImageW added in v1.3.381

func LoadImageW(hInst uintptr, pName uintptr, Type IMAGE_, cx, cy int32, fuLoad LR_) uintptr

LoadImageW 加载图标、光标、动画光标或位图.

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-loadimagew.

hInst: 包含要加载的图像的 DLL 或可执行文件 (.exe) 模块的句柄。 有关详细信息,请参阅 GetModuleHandle。若要 (图标、光标或位图文件) 加载预定义图像或独立资源,请将此参数设置为0.

pName: 要加载的图像。如果 hInst 参数为非0且 fuLoad 参数省略 LR_LOADFROMFILE, 则 pName 指定 hInst 模块中的图像资源。如果要按名称从模块加载图像资源, 则 pName 参数是指向包含映像资源名称的字符串. 如果要传字符串请用: common.StrPtr().

Type: 要加载的图像的类型。 wapi.IMAGE_ .

cx: 图标或光标的宽度(以像素为单位)。 如果此参数为零且 fuLoad 参数 为 LR_DEFAULTSIZE,则函数使用 SM_CXICON 或 SM_CXCURSOR 系统指标值来设置宽度。 如果此参数为零且未使用 LR_DEFAULTSIZE ,则函数使用实际资源宽度.

cy: 图标或光标的高度(以像素为单位)。 如果此参数为零且 fuLoad 参数 为 LR_DEFAULTSIZE,则函数使用 SM_CYICON 或 SM_CYCURSOR 系统指标值来设置高度。 如果此参数为零且未使用 LR_DEFAULTSIZE ,则函数使用实际资源高度.

fuLoad: 此参数可使用以下一个或多个值: wapi.LR_ .

返回值: 返回 HICON 句柄.

Example
package main

import (
	"fmt"
	"syscall"

	"github.com/twgh/xcgui/common"
	"github.com/twgh/xcgui/wapi"
)

func main() {
	hIcon := wapi.LoadImageW(0, common.StrPtr("C:\\Windows\\System32\\OneDrive.ico"), wapi.IMAGE_ICON, 0, 0, wapi.LR_LOADFROMFILE|wapi.LR_DEFAULTSIZE|wapi.LR_SHARED)
	fmt.Println("hIcon:", hIcon)
	fmt.Println("LastErr:", syscall.GetLastError())
}

func LstrcpyW

func LstrcpyW(lpString1, lpString2 uintptr) uintptr

LstrcpyW 将字符串复制到缓冲区.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-LstrcpyW.

lpString1: 用于接收 lpString2 参数指向的字符串内容的缓冲区. 缓冲区必须足够大以包含字符串,包括终止空字符.

lpString2: 要复制的以 NullStr 结尾的字符串.

返回值: 如果函数成功,则返回值是指向缓冲区的指针. 如果函数失败,则返回值为0, 并且lpString1可能不是以 NullStr 结尾的.

func MciGetErrorString added in v1.3.399

func MciGetErrorString(fdwError uint32) string

MciGetErrorString 获取 MCI 错误代码的文本描述.

  • 如果失败或未知错误代码,则返回空字符串.

fdwError: MciSendCommand 或 MciSendString 函数返回的错误代码。

https://learn.microsoft.com/zh-cn/previous-versions//dd757158(v=vs.85)

func MciSendString added in v1.3.399

func MciSendString(command string, returnString *string, cchReturn uint32, hwndCallback uintptr) uint32

MciSendString 向 MCI 设备发送命令字符串。命令发送的目标设备在该命令字符串中指定。

command: 指定 MCI 命令字符串。有关列表,请参见多媒体命令字符串: https://learn.microsoft.com/zh-cn/windows/win32/multimedia/multimedia-command-strings?redirectedfrom=MSDN

returnString: 指向接收返回信息的缓冲区的指针。如果不需要返回信息,则此参数可以为 nil。

cchReturn: 缓冲区的大小(以字符为单位)。

hwndCallback: 如果在命令字符串中指定了"notify"标志,则为回调窗口的句柄。

返回值:

https://learn.microsoft.com/zh-cn/previous-versions//dd757161(v=vs.85)

func MoveWindow added in v1.3.394

func MoveWindow(hWnd uintptr, x, y, width, height int32, bRepaint bool) bool

MoveWindow 更改指定窗口的位置和尺寸。 对于顶级窗口,位置和尺寸是相对于屏幕左上角的。 对于子窗口,它们相对于父窗口工作区的左上角。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-MoveWindow.

hWnd: 窗口句柄。

x: 窗口左上角的新 x 坐标。

y: 窗口左上角的新 y 坐标。

width: 窗口的新宽度。

height: 窗口的新高度。

bRepaint: 是否重绘窗口。这适用于工作区、非工作区 (包括标题栏和滚动条) ,以及由于移动子窗口而发现父窗口的任何部分。

func NewGUIDPointer added in v1.3.397

func NewGUIDPointer(guid string) unsafe.Pointer

func OpenClipboard

func OpenClipboard(hWnd uintptr) bool

OpenClipboard 打开剪贴板进行检查并防止其他应用程序修改剪贴板内容.

  • 如果另一个窗口打开了剪贴板,则 OpenClipboard 会失败.
  • 应用程序应在每次成功调用 OpenClipboard 后调用 CloseClipboard 函数.
  • 除非调用 EmptyClipboard 函数,否则由hWndNewOwner参数标识的窗口不会成为剪贴板所有者.
  • 如果应用程序在 hwnd 设置为0的情况下调用 OpenClipboard, EmptyClipboard 会将剪贴板所有者设置为NULL;这会导致 SetClipboardData 失败.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-OpenClipboard.

hWnd: 要与打开的剪贴板关联的窗口句柄。如果此参数为0,则打开的剪贴板与当前任务相关联.

func PeekMessage added in v1.3.394

func PeekMessage(lpMsg *MSG, hWnd uintptr, wMsgFilterMin, wMsgFilterMax, wRemoveMsg uint32) bool

PeekMessage 调度传入的非排队消息,检查已发布的消息的线程消息队列,并检索消息(如果有)。如果消息可用,则返回值为true。如果没有消息可用,则返回值为false。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-PeekMessageW.

lpMsg: 指向 MSG 结构的指针,该结构接收消息。

hWnd: 要检索其消息队列的窗口的句柄。窗口必须属于当前线程。如果 hWnd 为 NULL,则函数检索与调用线程关联的窗口的消息队列。

wMsgFilterMin: 指定要检索的最小消息 ID。 如果 wMsgFilterMin 为零,则不检查最小消息 ID。使用 WM_KEYFIRST(0x0100)指定第一条键盘消息或 WM_MOUSEFIRST(0x0200)来指定第一条鼠标消息。如果 wMsgFilterMin 和 wMsgFilterMax 均为零,PeekMessage 将返回所有可用消息(即,不执行范围筛选)。

wMsgFilterMax: 指定要检索的最大消息 ID。 使用 WM_KEYLAST 指定最后一条键盘消息或 WM_MOUSELAST 指定最后一条鼠标消息。如果 wMsgFilterMin 和 wMsgFilterMax 均为零,PeekMessage 将返回所有可用消息(即,不执行范围筛选)。

wRemoveMsg: 指定如何处理消息。此参数可以是以下一个或多个值: wapi.PM_。默认情况下,将处理所有消息类型。 若要指定只应处理某些消息,请指定以下一个或多个值: wapi.PM_QS_。

func PhysicalToLogicalPointForPerMonitorDPI added in v1.3.393

func PhysicalToLogicalPointForPerMonitorDPI(hWnd uintptr, lpPoint *POINT) bool

PhysicalToLogicalPointForPerMonitorDPI 将窗口中的点从物理坐标转换为逻辑坐标,而不考虑每英寸点数 (dpi) 对调用者的感知。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-physicaltologicalpointforpermonitordpi.

hWnd: 窗口句柄。

lpPoint: 指向 POINT 结构的指针,包含物理坐标,函数会将其转换为逻辑坐标。

func PlaySound added in v1.3.399

func PlaySound(pszSound string, hmod uintptr, fdwSound SND_) bool

PlaySound 播放由给定文件名、资源或系统事件指定的声音。

  • 主要是用来播放 wav 格式的音频文件, 不要用来播放 mp3。
  • 系统事件可能与注册表或 WIN.INI 文件中的声音相关联。
  • 会在以下目录中搜索声音文件:当前目录;Windows 目录;Windows 系统目录;PATH 环境变量中列出的目录;以及网络中映射的目录列表。如果函数找不到指定的声音且未指定 SND_NODEFAULT 标志,则会使用默认的系统事件声音代替。如果函数既找不到系统默认条目也找不到默认声音,则不发出声音并返回 FALSE。

pszSound: 指定要播放的声音的字符串。包括空终止符在内的最大长度为 256 个字符。

  • 如果此参数为空,则停止当前正在播放的任何波形声音。
  • 要停止非波形声音,请在 fdwSound 参数中指定 SND_PURGE。
  • fdwSound 中的三个标志( SND_ALIAS, SND_FILENAME, SND_RESOURCE )决定了名称是被解释为系统事件的别名、文件名还是资源标识符。如果未指定这些标志中的任何一个,则会在注册表或 WIN.INI 文件中搜索与指定声音名称的关联。如果找到关联,则播放声音事件。如果在注册表中未找到关联,则该名称将被解释为文件名。

hmod: 包含要加载资源的可执行文件的句柄。除非在 fdwSound 中指定了 SND_RESOURCE, 否则此参数必须为0。

fdwSound: 播放声音的标志组合, wapi.SND_ .

https://learn.microsoft.com/zh-cn/previous-versions//dd743680(v=vs.85)

func PostMessageW added in v1.3.360

func PostMessageW(hWnd uintptr, Msg uint32, wParam, lParam uintptr) bool

PostMessageW 在与创建指定窗口的线程关联的消息队列中放置(发布)一条消息,并在不等待线程处理消息的情况下返回.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-postmessagew.

hWnd: 窗口句柄,其窗口过程将接收消息。如果该参数为 HWND_BROADCAST ((HWND)0xffff),则将消息发送到系统中的所有顶层窗口,包括禁用或不可见的无主窗口、重叠窗口和弹出窗口;但消息不会发送到子窗口.

Msg: 要发送的消息。有关系统提供的消息的列表,请参阅: https://docs.microsoft.com/en-us/windows/win32/winmsg/about-messages-and-message-queues.

wParam: 其他特定于消息的信息.

lParam: 其他特定于消息的信息.

func PostQuitMessage added in v1.3.360

func PostQuitMessage(nExitCode int32)

PostQuitMessage 向系统指示线程已请求终止(退出)。它通常用于响应 WM_DESTROY 消息.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-PostQuitMessage.

nExitCode: 应用程序退出代码。该值用作 WM_QUIT 消息的wParam参数.

func PostThreadMessage added in v1.3.394

func PostThreadMessage(threadID uint32, msg uint32, wParam, lParam uintptr) bool

PostThreadMessage 将消息发布到指定线程的消息队列。它返回时不等待线程处理消息。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-PostThreadMessageW.

threadID: 要向其发布消息的线程的标识符。

  • 如果指定的线程没有消息队列,该函数将失败。 当线程首次调用某个用户或 GDI 函数时,系统会创建线程的消息队列。
  • 消息发布受 UIPI 的约束。 进程的线程只能将消息发布到较低或等于完整性级别的线程的已发布消息队列。
  • 此线程必须具有 SE_TCB_NAME 特权,才能将消息发布到属于具有相同本地唯一标识符(LUID)但位于其他桌面中的进程的线程。 否则,函数将失败并返回 ERROR_INVALID_THREAD_ID。
  • 此线程必须与调用线程属于同一桌面,或者属于具有相同 LUID 的进程。 否则,函数将失败并返回 ERROR_INVALID_THREAD_ID。

msg: 要发布的消息。

wParam: 消息的附加参数。

lParam: 消息的附加参数。

func RegisterClassEx added in v1.3.394

func RegisterClassEx(wc *WNDCLASSEX) uintptr

RegisterClassEx 注册一个窗口类,以便在调用 CreateWindow 或 CreateWindowEx 函数时使用。

  • 如果函数成功,则返回值为唯一标识要注册的类的类原子。 此原子只能由 CreateWindow, CreateWindowEx, GetClassInfo, GetClassInfoEx 使用, FindWindow, FindWindowEx 和 UnregisterClass 函数和 IActiveIMMap::FilterClientWindows 方法。
  • 如果函数失败,则返回值为零。 若要获取扩展的错误信息,请调用 GetLastError。
  • 卸载 DLL 时,不会取消注册 DLL 注册的窗口类。 DLL 必须在卸载时显式注销其类。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-registerclassexw.

wc: 在将结构传递给函数之前,必须用相应的类属性填充结构。

func RegisterHotKey added in v1.3.360

func RegisterHotKey(hWnd uintptr, id int32, fsModifiers, vk uint32) bool

RegisterHotKey 注册系统范围的热键.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-registerhotkey.

hWnd: 真实窗口句柄。将接收由热键生成的 WM_HOTKEY 消息的窗口句柄。如果此参数为0,则 WM_HOTKEY 消息将发布到调用线程的消息队列中,并且必须在消息循环中进行处理.

id: 热键的标识符。如果hWnd参数为0,则热键与当前线程相关联,而不是与特定窗口相关联。如果已存在具有相同hWnd和id参数的热键,请参阅备注了解所采取的操作.

fsModifiers: 为了生成 WM_HOTKEY 消息,必须与vk参数指定的键组合按下的键 。fsModifiers参数可以是以下值的组合: wapi.Mod_ .

vk: 热键的虚拟键代码: xcc.VK_ . 请参阅虚拟键码: https://docs.microsoft.com/zh-cn/windows/win32/inputdev/virtual-key-codes.

func RegisterWindowMessageW added in v1.3.381

func RegisterWindowMessageW(lpString string) int

RegisterWindowMessageW 定义保证在整个系统中唯一的新窗口消息。 发送或发布消息时可以使用消息值.

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-RegisterWindowMessageW.

lpString: 要注册的消息.

返回值: 如果成功注册消息,则返回值是范围0xC000到0xFFFF的消息标识符. 如果函数失败,则返回值为零.

func RtlMoveMemory

func RtlMoveMemory(Destination uintptr, Source uintptr, Length uint)

RtlMoveMemory 将源内存块的内容复制到目标内存块,并支持重叠的源内存块和目标内存块.

详情: https://docs.microsoft.com/zh-cn/windows/win32/devnotes/rtlmovememory.

Destination: 指向要复制字节的目标内存块的指针.

Source: 指向要复制字节的源内存块的指针.

Length: 从源复制到目标中的字节数.

func SHBrowseForFolderW

func SHBrowseForFolderW(browseInfo *BrowseInfoW) uintptr

SHBrowseForFolderW 显示一个对话框,使用户能够选择文件夹.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/shlobj_core/nf-shlobj_core-shbrowseforfolderw.

browseInfo: 指向 wapi.BrowseInfoW 结构的指针,该结构包含用于显示对话框的信息.

返回值: 返回一个 PIDL,它指定所选文件夹相对于命名空间根的位置。如果用户在对话框中选择取消按钮,则返回值为0。返回的 PIDL 可能是文件夹快捷方式而不是文件夹.

func SHCreateMemStream added in v1.3.395

func SHCreateMemStream(initData []byte) uintptr

SHCreateMemStream 创建内存流.

initData: 此缓冲区的内容用于设置内存流的初始内容。 如果此参数为 NULL,则返回的内存流没有任何初始内容。

https://learn.microsoft.com/zh-cn/windows/win32/api/shlwapi/nf-shlwapi-shcreatememstream

func SHCreateStreamOnFileEx added in v1.3.396

func SHCreateStreamOnFileEx(pszFile string, grfMode STGM, dwAttributes uint32, fCreate bool, pstmTemplate ...uintptr) (uintptr, error)

SHCreateStreamOnFileEx 打开或创建文件,并检索要读取或写入该文件的流。

pszFile: 指定文件名。

grfMode: 用于指定文件访问模式以及如何创建和删除公开流的对象的一个或多个 wapi.STGM 值。

dwAttributes: 一个或多个标志值,用于在创建新文件时指定文件属性。wapi.FILE_ATTRIBUTE_, wapi.FILE_FLAG_ .

fCreate: 可帮助与 grfMode 一起指定在创建流时应如何处理现有文件。

pstmTemplate: 保留参数.

https://learn.microsoft.com/zh-cn/windows/win32/api/shlwapi/nf-shlwapi-shcreatestreamonfileex

func SHGetPathFromIDListW

func SHGetPathFromIDListW(pidl uintptr, pszPath *string) bool

SHGetPathFromIDListW 将 SHBrowseForFolderW 的返回值转换为文件路径.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/shlobj_core/nf-shlobj_core-shgetpathfromidlistw.

pidl: SHBrowseForFolderW 的返回值.

pszPath: 返回的文件路径.

func SendMessageW added in v1.3.360

func SendMessageW(hWnd uintptr, Msg uint32, wParam, lParam uintptr) int

SendMessageW 将指定的消息发送到一个或多个窗口。SendMessage函数调用指定窗口的窗口过程,直到窗口过程处理完消息才返回.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-SendMessageW.

hWnd: 窗口句柄,其窗口过程将接收消息。如果该参数为 HWND_BROADCAST ((HWND)0xffff),则将消息发送到系统中的所有顶层窗口,包括禁用或不可见的无主窗口、重叠窗口和弹出窗口;但消息不会发送到子窗口.

Msg: 要发送的消息。有关系统提供的消息的列表,请参阅: https://docs.microsoft.com/en-us/windows/win32/winmsg/about-messages-and-message-queues.

wParam: 其他特定于消息的信息.

lParam: 其他特定于消息的信息.

返回值: 返回值指定消息处理的结果;这取决于发送的消息.

func SetClipboardData

func SetClipboardData(uFormat CF_, hMem uintptr) uintptr

SetClipboardData 以指定的剪贴板格式将数据放在剪贴板上。该窗口必须是当前剪贴板所有者,并且应用程序必须调用 OpenClipboard 函数.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-setclipboarddata.

uFormat: 标准或注册的剪贴板格式, wapi.CF_ .

hMem: 指定格式的数据的句柄。该参数可以为0,表示窗口根据请求提供指定剪贴板格式的数据(渲染格式).

返回值: 如果函数成功,则返回值是数据的句柄. 如果函数失败,则返回值为0.

func SetCursor added in v1.3.395

func SetCursor(hCursor uintptr) uintptr

SetCursor 设置鼠标光标。

  • 返回值是上一个游标的句柄(如果有)。
  • 如果没有上一个游标,则返回值为 0。

hCursor: 要设置的鼠标光标的句柄。

  • 游标必须由 CreateCursor 或 CreateIconIndirect 函数创建,或者由 LoadCursor 或 LoadImage 函数加载。
  • 如果此参数为 0,则光标将从屏幕中删除。

https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-setcursor

func SetFocus added in v1.3.394

func SetFocus(hwnd uintptr) uintptr

SetFocus 将键盘焦点设置为指定的窗口。窗口必须附加到调用线程的消息队列。如果函数成功,则返回值是以前具有键盘焦点的窗口的句柄。 如果 hWnd 参数无效或窗口未附加到调用线程的消息队列,则返回值为 NULL。 若要获取扩展错误信息,请调用 GetLastError 函数。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-SetFocus.

hWnd: 将接收键盘输入的窗口的句柄。 如果此参数为 NULL,则忽略击键。

func SetForegroundWindow

func SetForegroundWindow(hWnd uintptr) bool

SetForegroundWindow 将创建指定窗口的线程带到前台并激活窗口. 键盘输入被定向到窗口, 并且为用户改变了各种视觉提示. 系统为创建前台窗口的线程分配比其他线程稍高的优先级.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-SetForegroundWindow.

hWnd: 应激活并置于前台的窗口句柄.

func SetParent added in v1.3.394

func SetParent(hWndChild, hWndNewParent uintptr) uintptr

SetParent 更改指定子窗口的父窗口。如果函数成功,则返回值是上一个父窗口的句柄。失败则为0.

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-SetParent.

hWndChild: 子窗口的句柄。

hWndNewParent: 新父窗口的句柄。 如果此参数为 NULL,桌面窗口将成为新的父窗口。 如果此参数 HWND_MESSAGE,则子窗口将成为 仅消息窗口。

func SetWindowLongPtrW added in v1.3.393

func SetWindowLongPtrW(hWnd uintptr, nIndex int32, dwNewLong int) int

SetWindowLongPtrW 更改指定窗口的属性。该函数还会在额外的窗口内存中设置指定偏移量的值。返回设置前的属性值。如果函数失败,返回值为 0。在 386 架构中, 内部使用的是 SetWindowLongW.

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-SetWindowLongPtrW.

hWnd: 窗口的句柄,间接地是窗口所属的类。如果拥有由 hWnd 参数指定的进程位于 UIPI 层次结构中的进程高于调用线程所在的进程,则 SetWindowLongPtrW 函数将失败。

nIndex: 要设置的值的从零开始的偏移量。有效值介于零到额外窗口内存的字节数之间,减去 LONG_PTR 的大小。若要设置任何其他值,请指定以下值之一: wapi.GWL_ , wapi.GWLP_ . 当 hWnd 参数标识对话框时,也可以使用以下值: wapi.DWLP_ .

dwNewLong: 要设置的新值。

func SetWindowPos

func SetWindowPos(hWnd uintptr, hWndInsertAfter HWND_, x, y, cx, cy int32, wFlags SWP_) bool

SetWindowPos 改变一个子窗口,弹出式窗口或顶层窗口的尺寸,位置和Z序。子窗口,弹出式窗口,及顶层窗口根据它们在屏幕上出现的顺序排序、顶层窗口设置的级别最高,并且被设置为Z序的第一个窗口.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-SetWindowPos.

hWnd: 欲定位的窗口句柄.

hWndInsertAfter: 在Z序中位于定位窗口之前的窗口句柄. 此参数必须是窗口句柄或以下值之一: wapi.HWND_.

x: 窗口新的x坐标。如hwnd是一个子窗口,则x用父窗口的客户区坐标表示.

y: 窗口新的y坐标。如hwnd是一个子窗口,则y用父窗口的客户区坐标表示.

cx: 指定新的窗口宽度.

cy: 指定新的窗口高度.

wFlags: 窗口大小和定位的标志. 该参数可以是以下值的组合: wapi.SWP_.

func SetWindowRgn added in v1.3.395

func SetWindowRgn(hWnd uintptr, hRgn uintptr, bRedraw bool) bool

SetWindowRgn 设置窗口的窗口区域。窗口区域确定窗口中系统允许绘制的区域。系统不显示窗口区域外部的窗口的任何部分。

hWnd: 窗口句柄。

hRgn: 区域句柄(HRGN)。函数将窗口的窗口区域设置为此区域。如果 hRgn 为 NULL,则该函数将窗口区域设置为 NULL。

bRedraw: 是否重绘窗口。通常,如果窗口可见,请将 bRedraw 设置为 TRUE 。

https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-setwindowrgn

func SetWindowText added in v1.3.395

func SetWindowText(hWnd uintptr, str string) bool

SetWindowText 改变指定窗口的标题栏文本(如果有)或指定控件的文本内容。无法更改其他应用程序中控件的文本。

hWnd: 要改变文本的窗口或控件的句柄。

str: 要用作窗口或控件新文本的字符串。

https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-setwindowtextw.

func SetWindowsHookExW added in v1.3.391

func SetWindowsHookExW(idHook WH_, lpfn uintptr, hmod uintptr, dwThreadId uint32) uintptr

SetWindowsHookExW 将应用程序定义的挂钩过程安装到挂钩链中。 需要安装挂钩过程来监视系统的某些类型的事件。 这些事件与特定线程或与调用线程位于同一桌面中的所有线程相关联.

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-setWindowsHookExW.

idHook: 要安装的挂钩过程的类型, wapi.WH_ .

lpfn: 回调函数指针, 使用 syscall.NewCallback()生成. 如果 dwThreadId 参数为零或指定由其他进程创建的线程的标识符,则 lpfn 参数必须指向 DLL 中的挂钩过程。否则,lpfn 可以指向与当前进程关联的代码中的挂钩过程.

hmod: DLL 的句柄,包含 lpfn 参数指向的挂钩过程。如果 dwThreadId 参数指定当前进程创建的线程,并且挂钩过程位于与当前进程关联的代码中,则必须将 hMod 参数设置为 0.

dwThreadId: 要与之关联的挂钩过程的线程的标识符。对于桌面应用,如果此参数为零,则挂钩过程与调用线程在同一桌面中运行的所有现有线程相关联.

返回值: 如果成功,则返回挂钩过程的句柄; 如果失败,则返回 0.

func ShellExecuteW

func ShellExecuteW(hwnd uintptr, lpOperation, lpFile, lpParameters, lpDirectory string, nShowCmd xcc.SW_) int

ShellExecuteW 对指定文件执行操作.

详情: https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shellexecutew.

hwnd: 用于显示 UI 或错误消息的父窗口的句柄。如果操作与窗口无关,则此值可以为0.

lpOperation: 填“open”则打开lpFlie文档.

lpFile: 想用关联的程序打印或打开的一个程序名或文件名.

lpParameters: 如果lpFile是一个可执行文件,则这个字串包含了传递给执行程序的参数.

lpDirectory: 想使用的默认路径完整路径.

nShowCmd: 定义了如何显示启动程序的常数值, xcc.SW_.

返回值: 如果函数成功,则返回大于32的值。如果函数失败,则返回指示失败原因的错误值.

Example
package main

import (
	"github.com/twgh/xcgui/wapi"
	"github.com/twgh/xcgui/xcc"
)

func main() {
	// 打开指定网址
	wapi.ShellExecuteW(0, "open", "https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shellexecutew", "", "", xcc.SW_SHOWNORMAL)
	// 打开指定文件
	wapi.ShellExecuteW(0, "open", "C:\\Windows\\System32\\calc.exe", "", "", xcc.SW_SHOWNORMAL)
}

func ShowWindow added in v1.3.394

func ShowWindow(hWnd uintptr, nCmdShow xcc.SW_) bool

ShowWindow 设置指定窗口的显示状态。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-ShowWindow.

hWnd: 窗口的句柄。

nCmdShow: 指定窗口如何显示: xcc.SW_ .

func Sleep

func Sleep(ms uint32)

Sleep 暂停当前线程的执行,直到超时间隔结束。若要进入可警报等待状态,请使用 SleepEx 函数.

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/synchapi/nf-synchapi-sleep.

ms: 毫秒.

func SleepEx added in v1.3.381

func SleepEx(dwMilliseconds uint32, bAlertable bool) uint32

SleepEx 挂起当前线程,直到满足指定的条件。 发生以下情况之一时,将继续执行:

  • 调用 I/O 完成回调函数.
  • 异步过程调用 (APC) 排队到线程.
  • 超时间隔已过.

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/synchapi/nf-synchapi-sleepex.

dwMilliseconds: 暂停执行的时间间隔(以毫秒为单位).

bAlertable: 如果此参数为 FALSE,则函数在超时期限过后才会返回。 如果发生 I/O 完成回调,该函数不会立即返回,并且不会执行 I/O 完成函数。 如果 APC 已排队到线程,该函数不会立即返回,并且不会执行 APC 函数。如果 参数为 TRUE,并且调用此函数的线程与调用扩展 I/O 函数 (ReadFileEx 或 WriteFileEx) 的线程相同,则当超时期限已过或发生 I/O 完成回调函数时,函数将返回 。 如果发生 I/O 完成回调,则调用 I/O 完成函数。 如果将 APC 排队到 queueUserAPC) (线程,则当超时期限已过或调用 APC 函数时,函数将返回 .

返回值: 如果指定的时间间隔过期,则返回值为零。如果函数由于一个或多个 I/O 完成回调函数而返回,则返回值 WAIT_IO_COMPLETION. 仅当 bAlertable 为 TRUE,并且调用 SleepEx 函数的线程与调用扩展 I/O 函数的线程相同时,才会发生这种情况.

func TranslateMessage added in v1.3.360

func TranslateMessage(pMsg *MSG) bool

TranslateMessage 将虚拟键消息转换为字符消息。字符消息被发布到调用线程的消息队列中,以便在线程下次调用 GetMessage 或 PeekMessage 函数时读取.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-TranslateMessage.

pMsg: 一个指向 MSG 结构的指针,该结构包含使用 GetMessage 或 PeekMessage 函数从调用线程的消息队列中检索到的消息信息.

func UnhookWindowsHookEx added in v1.3.391

func UnhookWindowsHookEx(hhk uintptr) bool

UnhookWindowsHookEx 删除 SetWindowsHookExW 函数安装在挂钩链中的挂钩过程.

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-unhookWindowsHookEx.

hhk: 要移除的挂钩的句柄。此参数是由先前调用 SetWindowsHookExW 获取的挂钩句柄.

func UnregisterHotKey added in v1.3.360

func UnregisterHotKey(hWnd uintptr, id int32) bool

UnregisterHotKey 释放先前注册的热键.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-unregisterHotKey.

hWnd: 真实窗口句柄。与要释放的热键关联的窗口句柄。如果热键与窗口无关,则此参数应为0.

id: 要释放的热键的标识符.

func UpdateWindow added in v1.3.394

func UpdateWindow(hWnd uintptr) bool

UpdateWindow 如果窗口的更新区域不为空, UpdateWindow 函数通过向窗口发送 WM_PAINT 消息来更新指定窗口的工作区。 函数绕过应用程序队列,将 WM_PAINT 消息直接发送到指定窗口的窗口过程。 如果更新区域为空,则不发送任何消息。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-UpdateWindow.

hWnd: 要更新的窗口的句柄。

Types

type BIF_

type BIF_ uint32

BIF_ 是指定对话框选项的标志.

const (
	BIF_RETURNONLYFSDIRS BIF_ = 0x00000001 // 仅返回文件系统目录。如果用户选择不属于文件系统的文件夹,则“确定”按钮将变灰。注意对于“\\server”项目以及“\\server\share”和目录项目,“确定”按钮仍处于启用  状态。但是,如果用户选择“\\server”项,则将 SHBrowseForFolderW 返回的 PIDL 传递给 SHGetPathFromIDListW 将失败.

	BIF_DONTGOBELOWDOMAIN BIF_ = 0x00000002 // 不要在对话框的树视图控件中包含域级别以下的网络文件夹.

	BIF_STATUSTEXT BIF_ = 0x00000004 // 在对话框中包含一个状态区域。回调函数可以通过向对话框发送消息来设置状态文本。指定 BIF_NEWDIALOGSTYLE 时不支持此标志.

	BIF_RETURNFSANCESTORS BIF_ = 0x00000008 // 仅返回文件系统祖先。祖先是命名空间层次结构中根文件夹下的子文件夹。如果用户选择了不属于文件系统的根文件夹的祖先,则“确定”按钮将变灰.

	BIF_EDITBOX BIF_ = 0x00000010 // 在允许用户键入项目名称的浏览对话框中包含一个编辑控件.

	BIF_VALIDATE BIF_ = 0x00000020 // 如果用户在编辑框中输入了无效的名称,浏览对话框将调用应用程序的BrowseCallbackProc并发送BFFM_VALIDATEFAILED消息。如果未指定 BIF_EDITBOX,则忽略此标志.

	BIF_NEWDIALOGSTYLE BIF_ = 0x00000040 // 使用新的用户界面。设置此标志为用户提供了一个可以调整大小的更大对话框。该对话框具有多项新功能,包括:对话框内的拖放功能、重新排序、快捷菜单、新文件夹、删除和其他快捷菜单命令。注意  如果 COM 是通过CoInitializeEx初始化并设置了 COINIT_MULTITHREADED 标志,如果传递了 BIF_NEWDIALOGSTYLE,则 SHBrowseForFolderW 将失败.

	BIF_BROWSEINCLUDEURLS BIF_ = 0x00000080 // 浏览对话框可以显示 URL. BIF_USENEWUI 和 BIF_BROWSEINCLUDEFILES 标志也必须设置。如果未设置这三个标志中的任何一个,浏览器对话框将拒绝 URL。即使设置了这些标志,只有在包含所选项目的文件夹支持 URL 时,浏览对话框才会显示 URL。当调用文件夹的IShellFolder::GetAttributesOf方法来请求所选项目的属性时,文件夹必须设置SFGAO_FOLDER属性标志。否则,浏览对话框将不会显示 URL.

	BIF_USENEWUI = BIF_EDITBOX | BIF_NEWDIALOGSTYLE // 使用新的用户界面,包括一个编辑框。这个标志相当于 BIF_EDITBOX | BIF_NEWDIALOGSTYLE.

	BIF_UAHINT BIF_ = 0x00000100 // 与 BIF_NEWDIALOGSTYLE 结合使用时,会在对话框中添加使用提示来代替编辑框。BIF_EDITBOX 会覆盖此标志.

	BIF_NONEWFOLDERBUTTON BIF_ = 0x00000200 // 不要在浏览对话框中包含新建文件夹按钮.

	BIF_NOTRANSLATETARGETS BIF_ = 0x00000400 // 当所选项目是快捷方式时,返回快捷方式本身的 PIDL 而不是其目标.

	BIF_BROWSEFORCOMPUTER BIF_ = 0x00001000 // 只退回电脑。如果用户选择计算机以外的任何东西,则“确定”按钮将变灰.

	BIF_BROWSEFOPRINTER BIF_ = 0x00002000 // 只允许选择打印机。如果用户选择打印机以外的任何东西,则“确定”按钮将变灰。在 Windows XP 和更高版本的系统中,最佳做法是使用 Windows XP 样式的对话框,将对话框的根设置为Printers and Faxes文件夹 (CSIDL_PRINTERS).

	BIF_BROWSEINCLUDEFILES BIF_ = 0x00004000 // 浏览对话框显示文件和文件夹.

	BIF_SHAREABLE BIF_ = 0x00008000 // 浏览对话框可以显示远程系统上的共享资源。这适用于希望在本地系统上公开远程共享的应用程序。BIF_NEWDIALOGSTYLE 标志也必须设置.

	BIF_BROWSEFILEJUNCTIONS BIF_ = 0x00010000 // Windows 7 及更高版本。允许浏览文件夹连接,例如库或具有 .zip 文件扩展名的压缩文件.
)

type BrowseInfoW

type BrowseInfoW struct {
	HwndOwner uintptr // 父窗口句柄
	PidlRoot  uintptr // 指定开始浏览的根文件夹的位置。只有命名空间层次结构中的指定文件夹及其子文件夹出现在对话框中。该成员可以为0;在这种情况下,将使用默认位置.

	// 指向缓冲区的指针,用于接收用户选择的文件夹的显示名称。此缓冲区的大小假定为 260 个字符.
	//	displayNameBuffer := make([]uint16, 260)
	//	pszDisplayName := &displayNameBuffer[0]
	PszDisplayName *uint16

	// 指向显示在对话框中树视图控件上方的以空字符结尾的字符串的指针.
	//	例: lpszTitle, _ := syscall.UTF16PtrFromString("请选择目录")
	LpszTitle *uint16

	UlFlags BIF_    // 指定对话框选项的标志。可以为0,也可以是 wapi.BIF_ 的组合.
	Lpfn    uintptr // 指向应用程序定义函数的指针,当事件发生时对话框调用该函数.
	LParam  uintptr // 对话框传递给回调函数的应用程序定义的值(如果在lpfn中指定) .
	IImage  int32   // 接收与所选文件夹关联的图像索引,存储在系统图像列表中.
}

BrowseInfoW 包含用于显示对话框的信息.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/shlobj_core/ns-shlobj_core-browseinfow.

type CC_

type CC_ uint32

CC_ 是可用于初始化颜色对话框的位标志.

const (
	CC_ANYCOLOR CC_ = 0x00000100 // 使对话框显示一组基本颜色中的所有可用颜色.

	CC_ENABLEHOOK CC_ = 0x00000010 // 启用在此结构的 lpfnHook 成员中指定的挂钩过程。此标志仅用于初始化对话框.

	CC_ENABLETEMPLATE CC_ = 0x00000020 // hInstance 和 lpTemplateName成员指定一个对话框模板来代替默认模板。此标志仅用于初始化对话框.

	CC_ENABLETEMPLATEHANDLE CC_ = 0x00000040 // hInstance 成员标识包含预加载对话框模板的数据块 。如果指定了此标志,系统将忽略 lpTemplateName 成员。此标志仅用于初始化对话框.

	CC_FULLOPEN CC_ = 0x00000002 // 使对话框显示允许用户创建自定义颜色的附加控件。如果未设置此标志,用户必须单击定义自定义颜色按钮以显示自定义颜色控件.

	CC_PREVENTFULLOPEN CC_ = 0x00000004 // 禁用定义自定义颜色按钮.

	CC_RGBINIT CC_ = 0x00000001 // 使对话框使用 rgbResult 成员中指定的颜色作为初始颜色选择.

	CC_SHOWHELP CC_ = 0x00000008 // 使对话框显示“帮助”按钮。 hwndOwner 成员必须指定窗口以接收当用户单击帮助按钮 时对话框发送的 HELPMSGSTRING 注册消息.

	CC_SOLIDCOLOR CC_ = 0x00000080 // 使对话框仅显示基本颜色集中的纯色.
)

type CF_

type CF_ uint32

CF_ 标准剪贴板格式.

const (
	CF_TEXT         CF_ = 1  // 文字格式。每行以回车/换行(CR-LF)组合结束。空字符表示数据的结尾。对ANSI文本使用此格式.
	CF_BITMAP       CF_ = 2  // 位图的句柄(HBITMAP)
	CF_METAFILEPICT CF_ = 3  // 处理由METAFILEPICT结构定义的图元文件图片格式。通过动态数据交换(DDE)传递CF_METAFILEPICT句柄时,负责删除【HMEM】的应用程序也应该释放 CF_METAFILEPICT 句柄引用的元文件.
	CF_SYLK         CF_ = 4  // Microsoft符号链接(SYLK)格式.
	CF_DIF          CF_ = 5  // 软件艺术数据交换格式.
	CF_TIFF         CF_ = 6  // 标记图像文件格式.
	CF_OEMTEXT      CF_ = 7  // 文字格式包含OEM字符集中的字符。每行以回车/换行(CR-LF)组合结束。空字符表示数据的结尾.
	CF_DIB          CF_ = 8  // 一个包含BITMAPINFO结构的内存对象,后跟位图位.
	CF_PALETTE      CF_ = 9  // 处理调色板。每当应用程序将数据放置在依赖于或假定调色板的剪贴板中时,它也应将调色板放在剪贴板上。如果剪贴板包含CF_PALETTE(逻辑调色板)格式的数据,则应用程序应使用 SelectPalette 和 RealizePalette 函数来实现(比较)剪贴板中与该逻辑调色板的任何其他数据。当显示剪贴板数据时,Windows剪贴板始终将剪贴板上的任何对象用作CF_PALETTE格式的当前调色板.
	CF_PENDATA      CF_ = 10 // 用于Pen Computing的Microsoft Windows笔的扩展数据.
	CF_RIFF         CF_ = 11 // 表示音频数据比CF_WAVE标准波形格式更复杂.
	CF_WAVE         CF_ = 12 // 以诸如11 kHz或22 kHz脉冲编码调制(PCM)的标准波形格式之一表示音频数据.
	CF_UNICODETEXT  CF_ = 13 // 仅Windows NT: Unicode文字格式。每行以回车/换行(CR-LF)组合结束。空字符表示数据的结尾.
	CF_ENHMETAFILE  CF_ = 14 // 增强图元文件的句柄(HENHMETAFILE).
	CF_HDROP        CF_ = 15 // 类型为HDROP的句柄,用于标识文件列表。应用程序可以通过将句柄传递给DragQueryFile函数来检索有关文件的信息.
)

type COINIT_ added in v1.3.395

type COINIT_ uint32

COINIT_ 确定用于对此线程创建的对象的传入调用的并发模型。 此并发模型可以是单元线程模型,也可以是多线程模型。

const (
	COINIT_APARTMENTTHREADED COINIT_ = 0x2 // 初始化单元线程对象并发的线程
	COINIT_MULTITHREADED     COINIT_ = 0x0 // 初始化多线程对象并发的线程
	COINIT_DISABLE_OLE1DDE   COINIT_ = 0x4 // 禁用 DDE 以支持 OLE1
	COINIT_SPEED_OVER_MEMORY COINIT_ = 0x8 // 增加内存使用量,以尝试提高性能
)

type ChooseColor

type ChooseColor struct {
	// 结构的长度(以字节为单位).
	//	cc := wapi.ChooseColor{...}
	//	cc.LStructSize = uint32(unsafe.Sizeof(cc))
	LStructSize uint32

	// 拥有对话框的窗口句柄。此成员可以是任何有效的窗口句柄,或者如果对话框没有所有者,它可以为0.
	HwndOwner uintptr

	// 如果在Flags成员中设置了 CC_ENABLETEMPLATEHANDLE 标志,则 hInstance 是包含对话框模板的内存对象的句柄.
	//  - 如果设置了 CC_ENABLETEMPLATE 标志,则 hInstance 是一个模块句柄,该模块包含一个由 lpTemplateName 成员命名的对话框模板.
	//  - 如果既未设置 CC_ENABLETEMPLATEHANDLE 也未设置 CC_ENABLETEMPLATE,则忽略此成员.
	HInstance uintptr

	// 如果设置了 CC_RGBINIT 标志,则rgbResult指定创建对话框时最初选择的颜色.
	//  - 如果指定的颜色值不在可用颜色中,则系统选择最接近的可用纯色.
	//  - 如果 rgbResult 为零或未设置 CC_RGBINIT,则最初选择的颜色为黑色.
	//  - 如果用户单击OK按钮,则 rgbResult 指定用户的颜色选择。要创建RGB颜色值,请使用: xc.RGB().
	RgbResult uint32

	// 指向包含对话框中自定义颜色框的红、绿、蓝 (RGB) 值的 16 个值的数组的指针.
	//  - 如果用户修改了这些颜色,系统将使用新的 RGB 值更新数组。要在调用 ChooseColorW 函数之间保留新的自定义颜色,您应该为数组分配静态内存。要创建 RGB 颜色值,请使用: xc.RGB().
	//
	// 例子:
	//	var lpCustColors [16]uint32
	//	然后填 &lpCustColors[0]
	LpCustColors *uint32

	// 一组可用于初始化颜色对话框的位标志。当对话框返回时,它会设置这些标志来指示用户的输入。该成员可以是 wapi.CC_ 的组合.
	Flags CC_

	// 系统传递给由 lpfnHook 成员标识的钩子过程的应用程序定义的数据。当系统向挂钩过程发送 WM_INITDIALOG 消息时,该消息的 lParam 参数是一个指向对话框创建时指定的 ChooseColor 结构的指针。挂钩过程可以使用此指针来获取 lCustData 值.
	LCustData uintptr

	// 指向可以处理用于对话框的消息的 CCHookProc 挂钩过程的指针。除非在 Flags 成员中设置了 CC_ENABLEHOOK 标志,否则该成员将被忽略.
	LpfnHook uintptr

	// hInstance 成员标识的模块中对话框模板资源的名称。此模板替代了标准对话框模板。对于编号的对话框资源, lpTemplateName 可以是  MAKEINTRESOURCE 宏返回的值。除非在 Flags 成员中设置了 CC_ENABLETEMPLATE 标志,否则此成员将被忽略.
	LpTemplateName uintptr
}

ChooseColor 包含 ChooseColorW 函数用于初始化Color对话框的信息。用户关闭对话框后,系统在此结构中返回有关用户选择的信息.

type DWORD added in v1.3.394

type DWORD uint32

type GA_ added in v1.3.394

type GA_ uint32

GA_ 指定要检索的上级。

const (
	GA_PARENT    GA_ = 1 // 检索父窗口。 这不包括所有者,因为它与 GetParent 函数一样。
	GA_ROOT      GA_ = 2 // 通过遍历父窗口链来检索根窗口。
	GA_ROOTOWNER GA_ = 3 // 通过遍历 GetParent 返回的父窗口和所有者窗口链来检索拥有的根窗口。
)

type GET_MODULE_HANDLE_EX_FLAG_ added in v1.3.394

type GET_MODULE_HANDLE_EX_FLAG_ uint32

GET_MODULE_HANDLE_EX_FLAG_ 在 GetModuleHandleEx 中使用.

const (
	GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS GET_MODULE_HANDLE_EX_FLAG_ = 0x00000004 // lpModuleName 参数是模块中的地址。

	// 无论调用 FreeLibrary 多少次,模块都会一直加载到进程终止。
	//
	// 此选项不能用于 GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT。
	GET_MODULE_HANDLE_EX_FLAG_PIN GET_MODULE_HANDLE_EX_FLAG_ = 0x00000001

	// 模块的引用计数不会递增。 此选项等效于 GetModuleHandleW 的行为。不要将检索到的模块句柄传递给 FreeLibrary 函数;这样做可能会导致 DLL 过早地取消映射。 有关详细信息,请参阅“备注”。
	//
	// 此选项不能用于 GET_MODULE_HANDLE_EX_FLAG_PIN。
	GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT GET_MODULE_HANDLE_EX_FLAG_ = 0x00000002
)

type GMEM_

type GMEM_ uint32

GMEM_ 内存分配属性.

const (
	GHND          GMEM_ = 0x0042 // 结合 GMEM_Moveable 和 GMEM_ZeroInit
	GMEM_Fixed    GMEM_ = 0x0000 // 分配固定内存。返回值是一个指针.
	GMEM_Moveable GMEM_ = 0x0002 // 分配可移动内存。内存块永远不会在物理内存中移动,但它们可以在默认堆内移动。返回值是内存对象的句柄。要将句柄转换为指针,请使用 GlobalLock 函数。此值不能与 GMEM_Fixed 结合使用.

	GMEM_ZeroInit GMEM_ = 0x0040 // 将内存内容初始化为零.
	GPTR          GMEM_ = 0x0040 // 结合 GMEM_Fixed 和 GMEM_ZeroInit
)

type GUID added in v1.3.395

type GUID struct {
	Data1 uint32
	Data2 uint16
	Data3 uint16
	Data4 [8]byte
}

GUID is Windows API specific GUID type.

This exists to match Windows GUID type for direct passing for COM. Format is in xxxxxxxx-xxxx-xxxx-xxxxxxxxxxxxxxxx.

func NewGUID added in v1.3.395

func NewGUID(guid string) *GUID

NewGUID converts the given string into a globally unique identifier that is compliant with the Windows API.

The supplied string may be in any of these formats:

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}

The conversion of the supplied string is not case-sensitive.

func (*GUID) String added in v1.3.395

func (guid *GUID) String() string

String converts the GUID to string form. It will adhere to this pattern:

{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}

If the GUID is nil, the string representation of an empty GUID is returned:

{00000000-0000-0000-0000-000000000000}

type HRESULT added in v1.3.395

type HRESULT uintptr

type HWND_

type HWND_ int
const (
	HWND_NOTOPMOST HWND_ = -2 // 将窗口置于所有非顶层窗口之上(即在所有顶层窗口之后)。如果窗口已经是非顶层窗口则该标志不起作用.
	HWND_TOPMOST   HWND_ = -1 // 将窗口置于所有非顶层窗口之上。即使窗口未被激活, 窗口也将保持顶级位置.
	HWND_TOP       HWND_ = 0  // 将窗口置于Z序的顶部.
	HWND_BOTTOM    HWND_ = 1  // 将窗口置于Z序的底部。如果参数hWnd标识了一个顶层窗口,则窗口失去顶级位置,并且被置在所有其他窗口的底部.
)

type ID_

type ID_ uint32

ID_ 指示 MessageBoxW 的返回值.

const (
	ID_Abort    ID_ = 3  // 失败按钮被单击.
	ID_Cancel   ID_ = 2  // 取消按钮被单击.
	ID_Continue ID_ = 11 // 继续按钮被单击.
	ID_Ignore   ID_ = 5  // 忽略按钮被单击.
	ID_NO       ID_ = 7  // 否按钮被单击.
	ID_OK       ID_ = 1  // 确定按钮被单击.
	ID_Retry    ID_ = 4  // MB_RetryCancel 和 MB_AbortRetryIgnore 里的重试按钮被单击.
	ID_TryAgain ID_ = 10 // MB_CanaelTryContinue 里的重试按钮被单击.
	ID_YES      ID_ = 6  // 是按钮被单击.
)

func MessageBoxW

func MessageBoxW(hWnd uintptr, lpText, lpCaption string, uType MB_) ID_

MessageBoxW 显示一个模式对话框,其中包含一个系统图标、一组按钮和一条特定于应用程序的简短消息.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-MessageBoxW.

hWnd: 要创建的消息框的所有者窗口的句柄。如果此参数为0,则消息框没有所有者窗口.

lpText: 要显示的消息。如果字符串由多行组成,您可以在每行之间使用换行符分隔各行.

lpCaption: 对话框标题。如果此参数为空,则默认标题为Error.

uType: 对话框的内容和行为, 是以下值的组合: wapi.MB_.

返回值: 如果函数失败,则返回值为0; 成功则返回一个整数,指示用户单击了哪个按钮.

Example
package main

import (
	"fmt"

	"github.com/twgh/xcgui/wapi"
)

func main() {
	id := wapi.MessageBoxW(0, "context", "title", wapi.MB_CanaelTryContinue|wapi.MB_IconInformation)
	switch id {
	case wapi.ID_Cancel:
		fmt.Println("Cancel")
	case wapi.ID_TryAgain:
		fmt.Println("TryAgain")
	case wapi.ID_Continue:
		fmt.Println("Continue")
	default:
		fmt.Println(id)
	}
}

type IMAGE_ added in v1.3.381

type IMAGE_ uint32
const (
	IMAGE_BITMAP IMAGE_ = 0 // 加载位图
	IMAGE_ICON   IMAGE_ = 1 // 加载图标
	IMAGE_CURSOR IMAGE_ = 2 // 加载游标
)

type KBDLLHOOKSTRUCT added in v1.3.391

type KBDLLHOOKSTRUCT struct {
	VkCode      uint32  // 虚拟按键代码, xcc.VK_ . 详情: https://learn.microsoft.com/zh-cn/windows/win32/inputdev/virtual-key-codes.
	ScanCode    uint32  // 按键代码的硬件扫描代码.
	Flags       uint32  // 扩展键标志、事件注入标志、上下文代码和转换状态标志。此成员指定如下。应用程序可以使用以下值来测试击键标志。测试LLKHF_INJECTED (位 4) 将告知是否已注入事件。如果是,则测试 LLKHF_LOWER_IL_INJECTED (位 1) 会告诉你事件是否是从以较低完整性级别运行的进程注入的.
	Time        uint32  // 此消息的时间戳,相当于 GetMessageTime 为此消息返回的时间戳.
	DwExtraInfo uintptr // 与消息关联的其他信息.
}

KBDLLHOOKSTRUCT 包含有关低级别键盘输入事件的信息.

type LONG_PTR added in v1.3.393

type LONG_PTR int

LONG_PTR 是一个平台相关的有符号整数类型

type LR_ added in v1.3.381

type LR_ uint32
const (
	LR_CREATEDIBSECTION LR_ = 0x00002000 // 当 uType 参数指定 IMAGE_BITMAP 时,会导致函数返回 DIB 节位图而不是兼容的位图。 此标志可用于加载位图而不将其映射到显示设备的颜色.
	LR_DEFAULTCOLOR     LR_ = 0          // 默认标志;它不执行任何工作。 它的意思是“不 LR_MONOCHROME ”.
	LR_DEFAULTSIZE      LR_ = 0x00000040 // 如果 cxDesired 或 cyDesired 值设置为零,则使用游标或图标的系统指标值指定的宽度或高度。 如果未指定此标志,并且 cxDesired 和 cyDesired 设置为零,则函数将使用实际资源大小。 如果资源包含多个图像,则 函数使用第一个图像的大小.
	LR_LOADFROMFILE     LR_ = 0x00000010 // 从 名称 (图标、光标或位图文件指定的文件) 加载独立图像.

	// 在颜色表中搜索图像,并将以下灰色底纹替换为相应的三维颜色
	//	- Dk 灰色,RGB (128,128,128) 与 COLOR_3DSHADOW
	//	- 灰色,RGB (192,192,192) ,带 COLOR_3DFACE
	//	- Lt Gray,RGB (223,223,223) 与 COLOR_3DLIGHT
	LR_LOADMAP3DCOLORS LR_ = 0x00001000

	// 检索图像中第一个像素的颜色值,并将颜色表中的相应条目替换为默认窗口颜色 (COLOR_WINDOW) 。 图像中使用该条目的所有像素都将成为默认的窗口颜色。 此值仅适用于具有相应颜色表的图像.
	//
	// 如果要加载颜色深度大于 8bpp 的位图,请不要使用此选项.
	//
	// 如果 fuLoad 同时包含 LR_LOADTRANSPARENT 值和 LR_LOADMAP3DCOLORS 值, LR_LOADTRANSPARENT 优先。 但是,颜色表条目将替换为 COLOR_3DFACE 而不是 COLOR_WINDOW.
	LR_LOADTRANSPARENT LR_ = 0x00000020
	LR_MONOCHROME      LR_ = 0x00000001 // 加载黑白图像.

	// 如果多次加载映像,则共享映像句柄。 如果未设置 LR_SHARED ,则对同一资源的第二次 LoadImageW 调用将再次加载映像并返回不同的句柄.
	//
	// 使用此标志时,系统将在不再需要资源时销毁资源.
	//
	// 对于非标准大小、加载后可能会更改或从文件加载的图像,请勿使用 LR_SHARED .
	//
	// 加载系统图标或光标时,必须使用 LR_SHARED 否则函数将无法加载资源.
	//
	// 无论请求的大小如何,此函数都会查找缓存中具有请求的资源名称的第一个映像.
	LR_SHARED   LR_ = 0x00008000
	LR_VGACOLOR LR_ = 0x00000080 // 使用真正的 VGA 颜色.
)

type LowLevelKeyboardProc added in v1.3.391

type LowLevelKeyboardProc func(nCode int32, wParam xcc.WM_, lParam *KBDLLHOOKSTRUCT) uintptr

LowLevelKeyboardProc 是一个低级键盘钩子过程,它将接收有关键盘消息的信息.

nCode: 挂钩过程用于确定如何处理消息的代码. 如果 nCode 小于零,则挂钩过程必须将消息传递给 CallNextHookEx 函数,而无需进一步处理,并且应返回 CallNextHookEx 返回的值.

wParam: 键盘消息的标识符. 可以是以下消息之一: xcc.WM_KEYDOWN、xcc.WM_KEYUP、xcc.WM_SYSKEYDOWN 或 xcc.WM_SYSKEYUP.

LPARAM: 指向 KBDLLHOOKSTRUCT 结构的指针.

返回值: 如果 nCode 小于零,则挂钩过程必须返回 CallNextHookEx 返回的值. 如果 nCode 大于或等于零,并且挂钩过程未处理消息,强烈建议调用 CallNextHookEx 并返回它返回的值;否则,安装 WH_KEYBOARD_LL 挂钩的其他应用程序将不会收到挂钩通知,因此行为可能不正确. 如果挂钩过程处理了消息,它可能会返回非零值,以防止系统将消息传递给挂钩链的其余部分或目标窗口过程.

type LowLevelMouseProc added in v1.3.391

type LowLevelMouseProc func(nCode int32, wParam xcc.WM_, lParam *MSLLHOOKSTRUCT) uintptr

LowLevelMouseProc 是一个低级鼠标钩子过程,它将接收有关鼠标消息的信息.

nCode: 挂钩过程用于确定如何处理消息的代码. 如果 nCode 小于零,则挂钩过程必须将消息传递给 CallNextHookEx 函数,而无需进一步处理,并且应返回 CallNextHookEx 返回的值.

wParam: 鼠标消息的标识符. 可以是以下消息之一:xcc.WM_LBUTTONDOWN、xcc.WM_LBUTTONUP、xcc.WM_MOUSEMOVE、xcc.WM_MOUSEWHEEL、xcc.WM_RBUTTONDOWN 或 xcc.WM_RBUTTONUP.

LPARAM: 指向 MSLLHOOKSTRUCT 结构的指针.

返回值: 如果 nCode 小于零,则挂钩过程必须返回 CallNextHookEx 返回的值. 如果 nCode 大于或等于零,并且挂钩过程未处理消息,强烈建议调用 CallNextHookEx 并返回它返回的值;否则,安装 WH_MOUSE_LL 挂钩的其他应用程序将不会收到挂钩通知,因此行为可能不正确. 如果挂钩过程处理了消息,它可能会返回非零值,以防止系统将消息传递给挂钩链的其余部分或目标窗口过程.

type MB_

type MB_ uint32

MB_ 指示消息框的内容和行为.

const (
	MB_AbortRetryIgnore  MB_ = 0x00000002 // 消息框包含三个按钮:失败、重试和忽略.
	MB_CanaelTryContinue MB_ = 0x00000006 // 消息框包含三个按钮:取消、重试、继续。使用此消息框类型而不是 MB_AbortRetryIgnore.
	MB_Help              MB_ = 0x00004000 // 向消息框 添加帮助按钮。当用户单击帮助按钮或按 F1 时,系统会向所有者 发送WM_HELP消息.
	MB_OK                MB_ = 0x00000000 // 消息框包含一个按钮:确认。这是默认设置.
	MB_OkCancel          MB_ = 0x00000001 // 消息框包含两个按钮:确认和取消.
	MB_RetryCancel       MB_ = 0x00000005 // 消息框包含两个按钮:重试和取消.
	MB_YesNo             MB_ = 0x00000004 // 消息框包含两个按钮:是和否.
	MB_YesNoCancel       MB_ = 0x00000003 // 消息框包含三个按钮:是、否和取消.
)
const (
	MB_IconExclamation MB_ = 0x00000030 // 消息框中会出现一个感叹号图标.
	MB_IconWarning     MB_ = 0x00000030 // 消息框中会出现一个感叹号图标.
	MB_IconInformation MB_ = 0x00000040 // 一个由圆圈中的小写字母i组成的图标出现在消息框中.
	MB_IconAsterisk    MB_ = 0x00000040 // 一个由圆圈中的小写字母i组成的图标出现在消息框中.
	MB_IconQuestion    MB_ = 0x00000020 // 问号图标出现在消息框中。不再推荐使用问号消息图标,因为它不能清楚地表示特定类型的消息,并且作为问题的消息措辞可能适用于任何消息类型。此外,用户可能会将消息符号问号与帮助信息混淆。因此,请勿在消息框中使用此问号消息符号。系统继续支持它的包含只是为了向后兼容.
	MB_IconStop        MB_ = 0x00000010 // 一个停止标志图标出现在消息框中.
	MB_IconError       MB_ = 0x00000010 // 一个停止标志图标出现在消息框中.
	MB_IconHand        MB_ = 0x00000010 // 一个停止标志图标出现在消息框中.
)
const (
	MB_DefButton1 MB_ = 0x00000000 // 第一个按钮是默认按钮. MB_DefButton1 是默认值, 除非指定了 MB_DefButton2, MB_DefButton3 或 MB_DefButton4.
	MB_DefButton2 MB_ = 0x00000100 // 第二个按钮是默认按钮.
	MB_DefButton3 MB_ = 0x00000200 // 第三个按钮是默认按钮.
	MB_DefButton4 MB_ = 0x00000300 // 第四个按钮是默认按钮.
)
const (
	MB_ApplModal MB_ = 0x00000000 // 用户必须先响应消息框,然后才能在hWnd参数标识的窗口中继续工作。但是,用户可以移动到其他线程的窗口并在这些窗口中工作。根据应用程序中窗口的层次结构,用户可能能够移动到线程内的其他窗口。消息框父级的所有子窗口都会自动禁用,但弹出窗口不会。如果未指定 MB_SystemModal 或 MB_TaskModal, 则 MB_ApplModal 是默认值.

	MB_SystemModal MB_ = 0x00001000 // 与 MB_ApplModal 相同,只是消息框具有 WS_EX_TOPMOST 样式。使用系统模式消息框来通知用户需要立即注意的严重的、具有潜在破坏性的错误(例如,内存不足)。此标志对用户与除与hWnd关联的窗口之外的窗口进行交互的能力没有影响.

	MB_TaskModal MB_ = 0x00002000 // 与 MB_ApplModal 相同,除了如果hWnd参数为0则禁用所有属于当前线程的顶级窗口。当调用应用程序或库没有可用的窗口句柄但仍需要防止输入到调用线程中的其他窗口而不暂停其他线程时,请使用此标志.
)
const (
	MB_Default_Desktop_Only MB_ = 0x00020000 // 与交互式窗口站的桌面相同。有关详细信息,请参阅窗口站。 如果当前输入桌面不是默认桌面,MessageBox不会返回,直到用户切换到默认桌面.

	MB_Right         MB_ = 0x00080000 // 文本右对齐.
	MB_RtlReading    MB_ = 0x00100000 // 在希伯来语和阿拉伯语系统上使用从右到左的阅读顺序显示消息和标题文本.
	MB_SetForeground MB_ = 0x00010000 // 消息框成为前台窗口。在内部,系统为消息框调用 SetForegroundWindow 函数.
	MB_TopMost       MB_ = 0x00040000 // 消息框是使用 WS_EX_TOPMOST 窗口样式创建的.

	MB_Service_Notification MB_ = 0x00200000 // 调用者是通知用户事件的服务。即使没有用户登录到计算机,该功能也会在当前活动桌面上显示一个消息框。终端服务:如果调用线程具有模拟令牌,则该函数将消息框定向到模拟令牌中指定的会话。如果设置了此标志,则hWnd参数必须为0。这是为了使消息框可以出现在与hWnd对应的桌面以外的桌面上。有关使用此标志的安全注意事项的信息,请参阅交互式服务。特别要注意,此标志可以在锁定的桌面上生成交互式内容,因此只能用于非常有限的一组场景,例如资源耗尽.
)

type MSG added in v1.3.360

type MSG struct {
	Hwnd    uintptr
	Message uint32
	WParam  uintptr
	LParam  uintptr
	Time    uint32
	Pt      POINT
}

type MSLLHOOKSTRUCT added in v1.3.391

type MSLLHOOKSTRUCT struct {
	PT POINT // 鼠标光标的屏幕坐标

	// 说明:
	//  - 如果消息是 xcc.WM_MOUSEWHEEL 鼠标滚轮滚动消息,正值表示滚轮向前/上旋转(远离用户);负值表示滚轮向后/下旋转(朝向用户)。此成员的高位是滚轮增量, 可使用 wutil.GetHigh16Bits()来取高位值。保留低位。一次标准滚轮滚动的增量定义为 wapi.WHEEL_DELTA,即 120.
	//  - 如果消息是 xcc.WM_XBUTTONDOWN、xcc.WM_XBUTTONUP、xcc.WM_XBUTTONDBLCLK、xcc.WM_NCXBUTTONDOWN、xcc.WM_NCXBUTTONUP 或 xcc.WM_NCXBUTTONDBLCLK,则高位指定按下或释放的 X 按钮, 可使用 wutil.GetHigh16Bits()来取高位值。并且保留低位。此值可以是以下一个或多个值: 1. 按下或释放第一个 X 按钮; 2. 按下或释放第二个 X 按钮。否则,不使用 mouseData.
	MouseData int32

	Flags       uint32  // 事件注入的标志。应用程序可以使用以下值来测试标志。测试 LLMHF_INJECTED (位 0) 将告知是否已注入事件。如果是,则测试 LLMHF_LOWER_IL_INJECTED (位 1) 将告诉你事件是否是从以较低完整性级别运行的进程注入的.
	Time        uint32  // 此消息的时间戳.
	DwExtraInfo uintptr // 与消息关联的其他信息.
}

type OFN_

type OFN_ uint32

OFN_ 是用于初始化对话框的位标志

const (
	// 文件名列表框允许多选。
	//  - 如果您还设置了 OFN_EXPLORER 标志,则对话框使用资源管理器样式的用户界面;否则,它使用旧式用户界面。
	//  - 如果用户选择了多个文件, lpstrFile 缓冲区会返回当前目录的路径,后跟所选文件的文件名。 nFileOffset 成员是第一个文件名的偏移量,以字节或字符为单位,并且不使用 nFileExtension 成员。
	//  - 对于资源管理器样式的对话框,目录和文件名字符串是 NullStr 分隔的,最后一个文件名后有一个额外的 NullStr 字符。这种格式使 Explorer 样式的对话框能够返回包含空格的长文件名。
	//  - 对于旧式对话框,目录和文件名字符串用空格分隔,函数使用短文件名作为带空格的文件名。您可以使用 FindFirstFile 函数在长文件名和短文件名之间进行转换。
	//  - 如果为旧式对话框指定自定义模板,则文件名列表框的定义必须包含 LBS_EXTENDEDSEL 值.
	OFN_ALLOWMULTISELECT OFN_ = 0x00000200

	// 说明:
	//  - 如果用户指定的文件不存在,则此标志会导致对话框提示用户授予创建文件的权限。
	//  - 如果用户选择创建文件,对话框关闭并且函数返回指定的名称;否则,对话框保持打开状态。
	//  - 如果将此标志与 OFN_ALLOWMULTISELECT 标志一起使用,则对话框允许用户仅指定一个不存在的文件.
	OFN_CREATEPROMPT OFN_ = 0x00002000

	OFN_DONTADDDTORECENT OFN_ = 0x02000000 // 防止系统在包含用户最近使用的文档的文件系统目录中添加指向选定文件的链接。要检索此目录的位置,请使用 CSIDL_RECENT 标志 调用 SHGetSpecialFolderLocation 函数.

	OFN_ENABLEHOOK OFN_ = 0x00000020 // 启用在 lpfnHook 成员中指定的钩子函数.

	OFN_ENABLEINCLUDENOTIFY OFN_ = 0x00400000 // 当用户打开文件夹时,使对话框将 CDN_INCLUDEITEM 通知消息发送到您的 OFNHookProc 挂钩过程。该对话框会为新打开的文件夹中的每个项目发送通知。这些消息使您能够控制对话框在文件夹的项目列表中显示的项目.

	OFN_ENABLESIZING OFN_ = 0x00800000 // 允许使用鼠标或键盘调整资源管理器样式对话框的大小。默认情况下,资源管理器样式的打开和另存为对话框允许调整对话框的大小,无论是否设置了此标志。仅当您提供挂钩过程或自定义模板时,才需要此标志。旧式对话框不允许调整大小.

	// lpTemplateName 成员是指向模块中由 hInstance 成员标识的对话模板资源名称 的指针。
	//  - 如果设置了 OFN_EXPLORER 标志,系统将使用指定的模板创建一个对话框,该对话框是默认资源管理器样式对话框的子对话框。
	//  - 如果未设置 OFN_EXPLORER 标志,则系统使用模板创建旧式对话框,替换默认对话框.
	OFN_ENABLETEMPLATE OFN_ = 0x00000040

	// hInstance 成员标识包含预加载对话框模板的数据块.
	//  - 如果指定了此标志,系统将忽略 lpTemplateName.
	//  - 如果设置了 OFN_EXPLORER 标志,系统将使用指定的模板创建一个对话框,该对话框是默认资源管理器样式对话框的子对话框.
	//  - 如果未设置 OFN_EXPLORER 标志,则系统使用模板创建旧式对话框,替换默认对话框.
	OFN_ENABLETEMPLATEHANDLE OFN_ = 0x00000080

	// 指示对“打开”或“另存为”对话框所做的任何自定义都使用资源管理器样式的自定义方法.
	//  - 有关详细信息,请参阅 Explorer-Style Hook Procedures 和 Explorer-Style Custom Templates.
	//  - 默认情况下,无论是否设置了此标志,“打开”和“另存为”对话框都使用资源管理器样式的用户界面。仅当您提供挂钩过程或自定义模板或设置 OFN_ALLOWMULTISELECT 标志时,才需要此标志.
	//  - 如果您想要旧式用户界面,请省略 OFN_EXPLORER 标志并提供替换旧式模板或挂钩过程.
	//  - 如果您想要旧样式但不需要自定义模板或挂钩过程,只需提供一个始终返回FALSE的挂钩过程.
	OFN_EXPLORER OFN_ = 0x00080000

	OFN_EXTENSIONDIFFERENT OFN_ = 0x00000400 // 用户键入的文件扩展名与 lpstrDefExt 指定的扩展名不同。如果 lpstrDefExt 为NULL ,则该函数不使用此标志.

	// 用户只能在文件名输入字段中键入现有文件的名称.
	//  - 如果指定了此标志并且用户输入了无效名称,则对话框过程会在消息框中显示警告.
	//  - 如果指定了此标志,则还使用 OFN_PATHMUSTEXIST 标志。此标志可在打开对话框中使用。它不能与另存为对话框一起使用.
	OFN_FILEMUSTEXIST OFN_ = 0x00001000

	OFN_FORCESHOWHIDDEN OFN_ = 0x10000000 // 强制显示系统和隐藏文件,从而覆盖用户设置以显示或不显示隐藏文件。但是,未显示标记为系统和隐藏的文件.

	OFN_HIDEREADONLY OFN_ = 0x00000004 // 隐藏只读复选框.

	// 对于旧式对话框,此标志使对话框使用长文件名.
	//  - 如果未指定此标志,或者还设置了 OFN_ALLOWMULTISELECT 标志,则旧式对话框使用短文件名(8.3 格式)作为带空格的文件名。资源管理器样式的对话框忽略此标志并始终显示长文件名.
	OFN_LONGNAMES OFN_ = 0x00200000

	OFN_NOCHANGEDIR OFN_ = 0x00000008 // 如果用户在搜索文件时更改了目录,则将当前目录恢复为其原始值。此标志对 GetOpenFileNameW 无效.

	OFN_NODEREFERENCELINKS OFN_ = 0x00100000 // 指示对话框返回所选快捷方式 (.LNK) 文件的路径和文件名。如果未指定此值,则对话框返回快捷方式引用的文件的路径和文件名.

	OFN_NOLONGNAMES OFN_ = 0x00040000 // 对于旧式对话框,此标志使对话框使用短文件名(8.3 格式)。资源管理器样式的对话框忽略此标志并始终显示长文件名.

	OFN_NONETWORKBUTTON OFN_ = 0x00020000 // 隐藏和禁用网络按钮.

	OFN_NOREADONLYRETURN OFN_ = 0x00008000 // 返回的文件没有选中只读复选框,并且不在写保护目录中.

	OFN_NOTESTFILECREATE OFN_ = 0x00010000 // 在关闭对话框之前不会创建文件。如果应用程序将文件保存在创建非修改网络共享上,则应指定此标志。当应用程序指定此标志时,库不检查写保护、磁盘已满、驱动器门打开或网络保护。使用此标志的应用程序必须小心执行文件操作,因为文件一旦关闭就无法重新打开.

	// 常用对话框允许在返回的文件名中包含无效字符. 通常,调用应用程序使用一个挂钩过程,该过程使用 FILEOKSTRING 消息检查文件名.
	//  - 如果编辑控件中的文本框为空或只包含空格,则更新文件和目录列表.
	//  - 如果编辑控件中的文本框包含其他任何内容,则 nFileOffset 和 nFileExtension 将设置为通过解析文本生成的值。文本中没有添加默认扩展名,文本也没有复制到 lpstrFileTitle 指定的缓冲区.
	//  - 如果 nFileOffset 指定的值小于零,则文件名无效。否则,文件名有效,nFileExtension 并且 nFileOffset 可以像未指定 OFN_NOVALIDATE 标志一样使用.
	OFN_NOVALIDATE OFN_ = 0x00000100

	OFN_OVERWRITEPROMPT OFN_ = 0x00000002 // 如果所选文件已存在,则使“另存为”对话框生成一个消息框。用户必须确认是否覆盖文件.

	OFN_PATHMUTEXIST OFN_ = 0x00000800 // 用户只能键入有效的路径和文件名。如果使用此标志并且用户在“文件名”输入字段中键入了无效的路径和文件名,则对话框功能会在消息框中显示警告.

	OFN_READONLY OFN_ = 0x00000001 // 导致在创建对话框时最初选中只读复选框。此标志指示对话框关闭时 只读复选框的状态.

	// 指定如果对 OpenFile 函数的调用由于网络共享冲突而失败,则忽略该错误并且对话框返回选定的文件名.
	//  - 如果未设置此标志,则当用户指定的文件名发生网络共享冲突时,对话框会通知您的挂钩过程.
	//  - 如果设置了 OFN_EXPLORER 标志,对话框将 CDN_SHAREVIOLATION 消息发送到挂钩过程.
	//  - 如果不设置 OFN_EXPLORER,对话框会发送 SHAREVISTRING 注册消息到钩子过程.
	OFN_SHAREAWARE OFN_ = 0x00004000

	OFN_SHOWHELP OFN_ = 0x00000010 // 使对话框显示“帮助”按钮。 hwndOwner 成员必须指定窗口以接收当用户单击帮助按钮时对话框发送的 HELPMSGSTRING 注册消息。当用户单击“帮助”按钮 时,资源管理器样式的对话框会向您的挂钩过程发送 CDN_HELP 通知消息.
)

type OpenFileNameW

type OpenFileNameW struct {
	// 结构体大小.
	//	ofn := wapi.OpenFileNameW{...}
	//	ofn.LStructSize = uint32(unsafe.Sizeof(ofn))
	LStructSize uint32

	// 拥有对话框的窗口句柄。此成员可以是任何有效的窗口句柄,或者如果对话框没有所有者,它可以为0.
	HwndOwner uintptr

	// 可能如下:
	//	- 如果在 Flags 成员中设置了 OFN_ENABLETEMPLATEHANDLE 标志,则 HInstance 是包含对话框模板的内存对象的句柄.
	//	- 如果设置了 OFN_ENABLETEMPLATE 标志,则 HInstance 是一个模块句柄,该模块包含一个由 LpTemplateName 成员命名的对话框模板.
	//	- 如果两个标志都没有设置,则忽略此成员。如果设置了 OFN_EXPLORER 标志,系统将使用指定的模板创建一个对话框,该对话框是默认资源管理器样式对话框的子对话框.
	//	- 如果未设置 OFN_EXPLORER 标志,则系统使用模板创建旧式对话框,替换默认对话框.
	HInstance uintptr

	// 过滤器. 包含成对的以 NullStr 结尾的过滤器字符串的缓冲区。缓冲区中的最后一个字符串必须以两个 NullStr 字符终止.
	//  - 每对中的第一个字符串是描述过滤器的显示字符串(例如:“文本文件”),第二个字符串指定过滤器模式(例如:“ .TXT”)。要为单个显示字符串指定多个过滤器模式,请使用分号分隔模式(例如:“ .TXT; .DOC; .BAK”)。模式字符串可以是有效文件名字符和星号 (*) 通配符的组合。不要在模式字符串中包含空格.
	//  - 系统不会更改过滤器的顺序。它按照lpstrFilter中指定的顺序将它们显示在文件类型组合框中.
	//  - 如果 lpstrFilter 为NULL,则对话框不显示任何过滤器.
	//
	// 例子:
	//	lpstrFilter := strings.Join([]string{"Text Files(*txt)", "*.txt", "All Files(*.*)", "*.*"}, wapi.NullStr) + wapi.NullStr2
	//	lpstrFilter := common.StringToUint16Ptr(lpstrFilter)
	LpstrFilter *uint16

	// 一个静态缓冲区,其中包含一对以空值结尾的过滤器字符串,用于保存用户选择的过滤器模式。第一个字符串是描述自定义过滤器的显示字符串,第二个字符串是用户选择的过滤器模式。当您的应用程序第一次创建对话框时,您指定第一个字符串,它可以是任何非空字符串。当用户选择一个文件时,对话框将当前过滤模式复制到第二个字符串。保留的过滤器模式可以是lpstrFilter缓冲区中指定的模式之一,也可以是用户键入的过滤器模式。下次创建对话框时,系统使用字符串初始化用户定义的文件过滤器。如果nFilterIndex成员为零,对话框使用自定义过滤器.
	//  - 如果此成员为NULL,则对话框不保留用户定义的过滤器模式.
	//  - 如果此成员不是NULL,则nMaxCustFilter成员的值必须指定lpstrCustomFilter缓冲区的大小(以字符为单位) .
	LpstrCustomFilter *uint16

	// 由lpstrCustomFilter标识的缓冲区的大小(以字符为单位) 。此缓冲区应至少有 40 个字符长。如果 lpstrCustomFilter 为NULL或指向NULL的字符串,则忽略此成员.
	NMaxCustFilter uint32

	// 当前选定过滤器的索引。 lpstrFilter 指向的缓冲区包含定义过滤器的字符串对。第一对字符串的索引值为 1,第二对字符串的索引值为 2,依此类推。索引为零表示由 lpstrCustomFilter 指定的自定义过滤器。您可以在输入上指定一个索引,以指示对话框的初始过滤器描述和过滤器模式。当用户选择一个文件时, nFilterIndex 返回当前显示的过滤器的索引。如果 nFilterIndex 为零且 lpstrCustomFilter 为NULL,则系统使用 lpstrFilter 中的第一个过滤器缓冲。如果所有三个成员都为零或NULL,则系统不使用任何过滤器,并且不会在对话框的文件列表控件中显示任何文件.
	NFilterIndex uint32

	// 用于初始化文件名编辑控件的文件名。如果不需要初始化,此缓冲区的第一个字符必须为 NullStr 。当 GetOpenFileNameW 或 GetSaveFileNameW 函数成功返回时,此缓冲区包含所选文件的驱动器指示符、路径、文件名和扩展名.
	//  - 如果设置了 OFN_ALLOWMULTISELECT 标志并且用户选择了多个文件,则缓冲区包含当前目录,后跟所选文件的文件名。对于资源管理器样式的对话框,目录和文件名字符串是 NullStr 分隔的,最后一个文件名后有一个额外的 NullStr 字符。对于旧式对话框,字符串以空格分隔,函数使用短文件名作为带空格的文件名。您可以使用 FindFirstFile 函数在长文件名和短文件名之间进行转换。如果用户只选择一个文件, lpstrFile 字符串在路径和文件名之间没有分隔符.
	//  - 如果缓冲区太小,该函数返回FALSE并且 CommDlgExtendedError 函数返回 FNERR_BUFFERTOOSMALL 。在这种情况下, lpstrFile 缓冲区的前两个字节包含所需的大小,以字节或字符为单位.
	//
	// 例子:
	//	fileBuffer := make([]uint16, 260)//初始大小如果是单选文件的话, 就填260. 多选文件的话, 可根据情况增大
	//	lpstrFile := &fileBuffer[0]
	LpstrFile *uint16

	// lpstrFile指向的缓冲区的大小(以字符为单位)。缓冲区必须足够大以存储路径和文件名字符串或字符串,包括终止 NullStr 字符。如果缓冲区太小而无法包含文件信息, GetOpenFileNameW 和 GetSaveFileNameW 函数将返回FALSE 。缓冲区的长度应至少为 256 个字符.
	NMaxFile uint32

	// 所选文件的文件名和扩展名(不含路径信息)。该成员可以是NULL.
	//
	// 例子:
	//	lpstrFileTitle := make([]uint16, 260)
	//	然后填写: &lpstrFileTitle[0]
	LpstrFileTitle *uint16

	// lpstrFileTitle指向的缓冲区的大小(以字符为单位)。如果lpstrFileTitle为NULL ,则忽略此成员.
	NMaxFileTitle uint32

	// 初始目录.
	//	例: lpstrInitialDir, _ := syscall.UTF16PtrFromString("D:")
	LpstrInitialDir *uint16

	// 要放置在对话框标题栏中的字符串。如果此成员为NULL,则系统使用默认标题(即"另存为"或"打开").
	//	例: lpstrTitle, _ := syscall.UTF16PtrFromString("打开文件")
	LpstrTitle *uint16

	// 标志: wapi.OFN_ , 可组合, 可为0.
	Flags OFN_

	// 从路径开头到 lpstrFile 指向的字符串中的文件名的从零开始的偏移量(以字符为单位)。对于 Unicode 版本,这是字符数。例如:
	//  - 如果 lpstrFile 指向以下字符串“c:\dir1\dir2\file.ext”,则该成员包含值 13 以指示“file.ext”字符串的偏移量.
	//  - 如果用户选择了多个文件, nFileOffset 是第一个文件名的偏移量.
	NFileOffset uint16

	// 从路径开头到 lpstrFile 指向的字符串中的文件扩展名的从零开始的偏移量(以字符为单位)。对于 Unicode 版本,这是字符数。通常,文件扩展名是最后一次出现的点(“.”)字符之后的子字符串。例如txt是文件名readme.txt的扩展名,html是readme.txt.html的扩展名。因此:
	//  - 如果 lpstrFile 指向字符串“c:\dir1\dir2\readme.txt”,则该成员包含值 20。
	//  - 如果 lpstrFile 指向字符串“c:\dir1\dir2\readme.txt.html”,则此成员成员包含值 24。
	//  - 如果 lpstrFile 指向字符串“c:\dir1\dir2\readme.txt.html.”,该成员包含值 29。
	//  - 如果 lpstrFile 指向的字符串不包含任何“.” 字符如“c:\dir1\dir2\readme”,该成员包含零.
	NFileExtension uint16

	// 默认扩展名。如果用户未能键入扩展名, GetOpenFileNameW 和 GetSaveFileNameW 会将此扩展名附加到文件名中。此字符串可以是任意长度,但仅附加前三个字符。该字符串不应包含句点 (.)。如果此成员为NULL并且用户未能键入扩展名,则不会附加任何扩展名.
	//
	//	例: lpstrDefExt, _ := syscall.UTF16PtrFromString("txt")
	LpstrDefExt *uint16

	// 系统传递给由 lpfnHook 成员标识的钩子过程的应用程序定义的数据。当系统向挂钩过程发送 WM_INITDIALOG 消息时,该消息的 lParam 参数是一个指向对话框创建时指定的 OpenFileNameW 结构的指针。挂钩过程可以使用此指针来获取 lCustData 值.
	LCustData uintptr

	// 指向钩子过程的指针。除非 Flags 成员包含 OFN_ENABLEHOOK 标志,否则此成员将被忽略.
	//	- 如果在Flags成员中没有设置 OFN_EXPLORER 标志, lpfnHook 是一个指向 OFNHookProcOldStyle 挂钩过程的指针,该过程接收用于对话框的消息。挂钩过程返回FALSE以将消息传递给默认对话框过程,或返回TRUE以丢弃消息.
	//	- 如果设置了 OFN_EXPLORER, lpfnHook 是一个指向 OFNHookProc 挂钩过程的指针。挂钩过程接收从对话框发送的通知消息。挂钩过程还接收您通过指定子对话框模板定义的任何其他控件的消息。挂钩过程不接收用于默认对话框的标准控件的消息.
	LpfnHook uintptr

	// 由 hInstance 成员标识的模块中对话模板资源的名称。对于编号的对话框资源,这可以是 MAKEINTRESOURCE 宏返回的值。除非在 Flags 成员中设置了 OFN_ENABLETEMPLATE 标志,否则该成员将被忽略.
	//  - 如果设置了 OFN_EXPLORER 标志,系统将使用指定的模板创建一个对话框,该对话框是默认资源管理器样式对话框的子对话框.
	//  - 如果未设置 OFN_EXPLORER 标志,则系统使用模板创建旧式对话框,替换默认对话框.
	LpTemplateName uintptr
}

OpenFileNameW 包含 GetOpenFileNameW 和 GetSaveFileNameW 函数用于初始化“打开”或“另存为”对话框的信息。用户关闭对话框后,系统在此结构中返回有关用户选择的信息.

详情: https://docs.microsoft.com/zh-cn/windows/win32/api/commdlg/ns-commdlg-openfilenamea.

type PEN_FLAG_ added in v1.3.395

type PEN_FLAG_ uint32

PEN_FLAG_ 定义笔输入标志常量

const (
	PEN_FLAG_NONE     PEN_FLAG_ = 0x00000000 // 默认无标志
	PEN_FLAG_BARREL   PEN_FLAG_ = 0x00000001 // 笔杆按钮按下
	PEN_FLAG_INVERTED PEN_FLAG_ = 0x00000002 // 笔尖倒置
	PEN_FLAG_ERASER   PEN_FLAG_ = 0x00000004 // 橡皮擦按钮按下
)

type PEN_MASK_ added in v1.3.395

type PEN_MASK_ uint32

PEN_MASK_ 定义笔输入掩码常量

const (
	PEN_MASK_NONE     PEN_MASK_ = 0x00000000 // 默认值 - 所有可选字段均无效
	PEN_MASK_PRESSURE PEN_MASK_ = 0x00000001 // 压力字段有效
	PEN_MASK_ROTATION PEN_MASK_ = 0x00000002 // 旋转字段有效
	PEN_MASK_TILT_X   PEN_MASK_ = 0x00000004 // X轴倾斜字段有效
	PEN_MASK_TILT_Y   PEN_MASK_ = 0x00000008 // Y轴倾斜字段有效
)

type POINT added in v1.3.380

type POINT struct {
	X int32
	Y int32
}

type POINTER_CHANGE_ added in v1.3.395

type POINTER_CHANGE_ uint32

POINTER_CHANGE_ 定义了指针按钮状态变化的类型

const (
	POINTER_CHANGE_NONE              POINTER_CHANGE_ = iota // 无按钮状态变化
	POINTER_CHANGE_FIRSTBUTTON_DOWN                         // 第一个按钮按下
	POINTER_CHANGE_FIRSTBUTTON_UP                           // 第一个按钮释放
	POINTER_CHANGE_SECONDBUTTON_DOWN                        // 第二个按钮按下
	POINTER_CHANGE_SECONDBUTTON_UP                          // 第二个按钮释放
	POINTER_CHANGE_THIRDBUTTON_DOWN                         // 第三个按钮按下
	POINTER_CHANGE_THIRDBUTTON_UP                           // 第三个按钮释放
	POINTER_CHANGE_FOURTHBUTTON_DOWN                        // 第四个按钮按下
	POINTER_CHANGE_FOURTHBUTTON_UP                          // 第四个按钮释放
	POINTER_CHANGE_FIFTHBUTTON_DOWN                         // 第五个按钮按下
	POINTER_CHANGE_FIFTHBUTTON_UP                           // 第五个按钮释放
)

type POINTER_FLAG_ added in v1.3.395

type POINTER_FLAG_ uint32

POINTER_FLAG_ 指针输入标志常量

const (
	POINTER_FLAG_NONE           POINTER_FLAG_ = 0x00000000 // 默认无标志
	POINTER_FLAG_NEW            POINTER_FLAG_ = 0x00000001 // 新指针
	POINTER_FLAG_INRANGE        POINTER_FLAG_ = 0x00000002 // 指针未离开范围
	POINTER_FLAG_INCONTACT      POINTER_FLAG_ = 0x00000004 // 指针处于接触状态
	POINTER_FLAG_FIRSTBUTTON    POINTER_FLAG_ = 0x00000010 // 主按钮动作
	POINTER_FLAG_SECONDBUTTON   POINTER_FLAG_ = 0x00000020 // 副按钮动作
	POINTER_FLAG_THIRDBUTTON    POINTER_FLAG_ = 0x00000040 // 第三按钮
	POINTER_FLAG_FOURTHBUTTON   POINTER_FLAG_ = 0x00000080 // 第四按钮
	POINTER_FLAG_FIFTHBUTTON    POINTER_FLAG_ = 0x00000100 // 第五按钮
	POINTER_FLAG_PRIMARY        POINTER_FLAG_ = 0x00002000 // 系统主指针
	POINTER_FLAG_CONFIDENCE     POINTER_FLAG_ = 0x00004000 // 非意外触发的指针
	POINTER_FLAG_CANCELED       POINTER_FLAG_ = 0x00008000 // 异常离开的指针
	POINTER_FLAG_DOWN           POINTER_FLAG_ = 0x00010000 // 指针按下状态(接触开始)
	POINTER_FLAG_UPDATE         POINTER_FLAG_ = 0x00020000 // 指针更新
	POINTER_FLAG_UP             POINTER_FLAG_ = 0x00040000 // 指针抬起状态(接触结束)
	POINTER_FLAG_WHEEL          POINTER_FLAG_ = 0x00080000 // 垂直滚轮
	POINTER_FLAG_HWHEEL         POINTER_FLAG_ = 0x00100000 // 水平滚轮
	POINTER_FLAG_CAPTURECHANGED POINTER_FLAG_ = 0x00200000 // 捕获丢失
	POINTER_FLAG_HASTRANSFORM   POINTER_FLAG_ = 0x00400000 // 关联变换矩阵的输入
)

type PT_ added in v1.3.395

type PT_ uint32

PT_ 定义了指针输入的类型

const (
	// PT_POINTER 普通指针输入
	PT_POINTER PT_ = iota + 1
	// PT_TOUCH 触摸输入
	PT_TOUCH
	// PT_PEN 笔输入
	PT_PEN
	// PT_MOUSE 鼠标输入
	PT_MOUSE
	// PT_TOUCHPAD 触摸板输入
	PT_TOUCHPAD
)

type SM_ added in v1.3.394

type SM_ int32

SM_ 定义了一些常用的系统度量索引

const (
	SM_CXSCREEN          SM_ = 0      // 屏幕宽度(像素)
	SM_CYSCREEN          SM_ = 1      // 屏幕高度(像素)
	SM_CXVSCROLL         SM_ = 2      // 垂直滚动条箭头宽度
	SM_CYHSCROLL         SM_ = 3      // 水平滚动条箭头高度
	SM_CYCAPTION         SM_ = 4      // 标题栏高度
	SM_CXBORDER          SM_ = 5      // 窗口边框宽度
	SM_CYBORDER          SM_ = 6      // 窗口边框高度
	SM_CXDLGFRAME        SM_ = 7      // 对话框边框宽度
	SM_CYDLGFRAME        SM_ = 8      // 对话框边框高度
	SM_CYVTHUMB          SM_ = 9      // 垂直滚动条滑块高度
	SM_CXHTHUMB          SM_ = 10     // 水平滚动条滑块宽度
	SM_CXICON            SM_ = 11     // 默认图标宽度
	SM_CYICON            SM_ = 12     // 默认图标高度
	SM_CXCURSOR          SM_ = 13     // 光标宽度
	SM_CYCURSOR          SM_ = 14     // 光标高度
	SM_CYMENU            SM_ = 15     // 菜单栏高度
	SM_CXFULLSCREEN      SM_ = 16     // 全屏窗口的客户区宽度
	SM_CYFULLSCREEN      SM_ = 17     // 全屏窗口的客户区高度
	SM_CYKANJIWINDOW     SM_ = 18     // 日语汉字窗口高度(已废弃)
	SM_MOUSEPRESENT      SM_ = 19     // 鼠标是否存在(0=无,非零=有)
	SM_CYVSCROLL         SM_ = 20     // 垂直滚动条高度
	SM_CXHSCROLL         SM_ = 21     // 水平滚动条宽度
	SM_DEBUG             SM_ = 22     // 是否启用调试版本
	SM_SWAPBUTTON        SM_ = 23     // 鼠标左右键是否交换
	SM_CXMIN             SM_ = 28     // 窗口最小宽度
	SM_CYMIN             SM_ = 29     // 窗口最小高度
	SM_CXSIZE            SM_ = 30     // 标题栏按钮宽度
	SM_CYSIZE            SM_ = 31     // 标题栏按钮高度
	SM_CXFRAME           SM_ = 32     // 可调整边框宽度(同 SM_CXSIZEFRAME )
	SM_CYFRAME           SM_ = 33     // 可调整边框高度(同 SM_CYSIZEFRAME )
	SM_CXMINTRACK        SM_ = 34     // 窗口最小跟踪宽度
	SM_CYMINTRACK        SM_ = 35     // 窗口最小跟踪高度
	SM_CXDOUBLECLK       SM_ = 36     // 双击有效区域宽度
	SM_CYDOUBLECLK       SM_ = 37     // 双击有效区域高度
	SM_CXICONSPACING     SM_ = 38     // 图标排列单元格宽度
	SM_CYICONSPACING     SM_ = 39     // 图标排列单元格高度
	SM_MENUDROPALIGNMENT SM_ = 40     // 菜单弹出方向(0=左对齐,非零=右对齐)
	SM_PENWINDOWS        SM_ = 41     // PenWindows 是否加载
	SM_DBCSENABLED       SM_ = 42     // 是否启用 DBCS 字符集
	SM_CMOUSEBUTTONS     SM_ = 43     // 鼠标按钮数量(0=无鼠标)
	SM_SECURE            SM_ = 44     // 是否启用安全模式
	SM_CXEDGE            SM_ = 45     // 3D边框宽度
	SM_CYEDGE            SM_ = 46     // 3D边框高度
	SM_CXMINSPACING      SM_ = 47     // 图标网格单元格宽度
	SM_CYMINSPACING      SM_ = 48     // 图标网格单元格高度
	SM_CXSMICON          SM_ = 49     // 小图标建议宽度
	SM_CYSMICON          SM_ = 50     // 小图标建议高度
	SM_CYSMCAPTION       SM_ = 51     // 小标题栏高度
	SM_CXSMSIZE          SM_ = 52     // 小标题栏按钮宽度
	SM_CYSMSIZE          SM_ = 53     // 小标题栏按钮高度
	SM_CXMENUSIZE        SM_ = 54     // 菜单栏按钮宽度
	SM_CYMENUSIZE        SM_ = 55     // 菜单栏按钮高度
	SM_ARRANGE           SM_ = 56     // 排列方向标志
	SM_CXMINIMIZED       SM_ = 57     // 最小化窗口宽度
	SM_CYMINIMIZED       SM_ = 58     // 最小化窗口高度
	SM_CXMAXTRACK        SM_ = 59     // 窗口最大可调宽度
	SM_CYMAXTRACK        SM_ = 60     // 窗口最大可调高度
	SM_CXMAXIMIZED       SM_ = 61     // 最大化窗口宽度
	SM_CYMAXIMIZED       SM_ = 62     // 最大化窗口高度
	SM_NETWORK           SM_ = 63     // 网络存在标志(最低位=1表示存在)
	SM_CLEANBOOT         SM_ = 67     // 启动模式(0=正常,1=安全模式,2=带网络的安全模式)
	SM_CXDRAG            SM_ = 68     // 拖动生效区域宽度
	SM_CYDRAG            SM_ = 69     // 拖动生效区域高度
	SM_SHOWSOUNDS        SM_ = 70     // 是否强制视觉提示代替声音
	SM_CXMENUCHECK       SM_ = 71     // 菜单复选框宽度
	SM_CYMENUCHECK       SM_ = 72     // 菜单复选框高度
	SM_SLOWMACHINE       SM_ = 73     // 是否低性能计算机
	SM_MIDEASTENABLED    SM_ = 74     // 是否启用中东语言支持
	SM_MOUSEWHEELPRESENT SM_ = 75     // 是否支持鼠标滚轮
	SM_XVIRTUALSCREEN    SM_ = 76     // 虚拟屏幕左上角X坐标
	SM_YVIRTUALSCREEN    SM_ = 77     // 虚拟屏幕左上角Y坐标
	SM_CXVIRTUALSCREEN   SM_ = 78     // 虚拟屏幕宽度
	SM_CYVIRTUALSCREEN   SM_ = 79     // 虚拟屏幕高度
	SM_CMONITORS         SM_ = 80     // 显示器数量
	SM_SAMEDISPLAYFORMAT SM_ = 81     // 所有显示器颜色格式是否相同
	SM_IMMENABLED        SM_ = 82     // 是否启用输入法
	SM_CXFOCUSBORDER     SM_ = 83     // 焦点边框宽度
	SM_CYFOCUSBORDER     SM_ = 84     // 焦点边框高度
	SM_TABLETPC          SM_ = 86     // 是否是 Tablet PC
	SM_MEDIACENTER       SM_ = 87     // 是否是 Media Center Edition
	SM_STARTER           SM_ = 88     // 是否是 Windows Starter Edition
	SM_SERVERR2          SM_ = 89     // 是否是 Windows Server 2003 R2
	SM_REMOTESESSION     SM_ = 0x1000 // 是否在远程会话中
)

type SND_ added in v1.3.399

type SND_ uint32

SND_ 播放声音的标志位.

const (
	SND_SYNC        SND_ = 0x0000     // 同步播放声音,函数在声音播放完成后才返回。这是默认行为
	SND_ASYNC       SND_ = 0x0001     // 异步播放声音,函数在开始播放后立即返回。要终止异步播放的声音,可以使用 NULL 调用 PlaySound
	SND_NODEFAULT   SND_ = 0x0002     // 找不到声音时不播放默认声音,保持静默
	SND_MEMORY      SND_ = 0x0004     // 指针指向内存中的声音数据
	SND_LOOP        SND_ = 0x0008     // 循环播放声音直到再次调用 PlaySound 且 pszSound 参数为 NULL。设置此标志时必须同时设置 SND_ASYNC 标志
	SND_NOSTOP      SND_ = 0x0010     // 指定的声音事件会让步于同一进程中已经在播放的另一个声音事件。如果因为生成声音所需的资源正忙于播放其他声音而导致声音无法播放,函数会立即返回 FALSE 而不播放请求的声音
	SND_NOWAIT      SND_ = 0x00002000 // 不支持(注意:早期文档错误地标记为此标志受支持,但函数会忽略此标志)
	SND_ALIAS       SND_ = 0x00010000 // pszSound 参数是注册表或 WIN.INI 文件中的系统事件别名。不能与 SND_FILENAME 或 SND_RESOURCE 一起使用
	SND_ALIAS_ID    SND_ = 0x00110000 // pszSound 参数是系统事件别名的预定义标识符
	SND_FILENAME    SND_ = 0x00020000 // pszSound 参数是一个文件名。如果找不到文件,则播放默认声音,除非设置了 SND_NODEFAULT 标志
	SND_RESOURCE    SND_ = 0x00040004 // pszSound 参数是一个资源标识符;hmod 必须标识包含该资源的实例
	SND_PURGE       SND_ = 0x0040     // 要停止非波形声音,请在 fdwSound 参数中指定。
	SND_APPLICATION SND_ = 0x0080     // pszSound 参数是注册表中的应用程序特定别名。您可以将此标志与 SND_ALIAS 或 SND_ALIAS_ID 标志结合使用,以指定应用程序定义的声音别名
	SND_SENTRY      SND_ = 0x00080000 // 触发 SoundSentry 事件(需要 Windows Vista 或更高版本)。 SoundSentry 是一项辅助功能,当播放声音时会导致计算机显示视觉提示
	SND_RING        SND_ = 0x00100000 // 将此视为来自通信应用程序的"铃声" - 不降低音量
	SND_SYSTEM      SND_ = 0x00200000 // 分配给系统通知声音的音频会话(需要 Windows Vista 或更高版本)。系统音量控制程序(SndVol)会显示一个控制系统通知声音的音量滑块
)
const (
	SND_ALIAS_SYSTEMASTERISK    SND_ = ('*' << 8) | 'S'
	SND_ALIAS_SYSTEMQUESTION    SND_ = ('?' << 8) | 'S'
	SND_ALIAS_SYSTEMHAND        SND_ = ('H' << 8) | 'S'
	SND_ALIAS_SYSTEMEXIT        SND_ = ('E' << 8) | 'S'
	SND_ALIAS_SYSTEMSTART       SND_ = ('S' << 8) | 'S'
	SND_ALIAS_SYSTEMWELCOME     SND_ = ('W' << 8) | 'S'
	SND_ALIAS_SYSTEMEXCLAMATION SND_ = ('!' << 8) | 'S'
	SND_ALIAS_SYSTEMDEFAULT     SND_ = ('D' << 8) | 'S'
)

type STGM added in v1.3.396

type STGM uint32

STGM 是指示创建和删除对象的条件以及对象的访问模式的标志。

https://learn.microsoft.com/zh-cn/windows/win32/stg/stgm-constants

const (
	// STGM_READ 只读访问模式
	STGM_READ STGM = 0x00000000

	// STGM_WRITE 只写访问模式
	STGM_WRITE STGM = 0x00000001

	// STGM_READWRITE 读写访问模式
	STGM_READWRITE STGM = 0x00000002

	// STGM_SHARE_DENY_NONE 允许其他进程以任何模式打开
	STGM_SHARE_DENY_NONE STGM = 0x00000040

	// STGM_SHARE_DENY_READ 禁止其他进程读取访问
	STGM_SHARE_DENY_READ STGM = 0x00000030

	// STGM_SHARE_DENY_WRITE 禁止其他进程写入访问
	STGM_SHARE_DENY_WRITE STGM = 0x00000020

	// STGM_SHARE_EXCLUSIVE 独占访问,禁止其他进程访问
	STGM_SHARE_EXCLUSIVE STGM = 0x00000010

	// STGM_CREATE 如果不存在则创建新的存储对象
	STGM_CREATE STGM = 0x00001000

	// STGM_CONVERT 转换存储格式
	STGM_CONVERT STGM = 0x00020000

	// STGM_FAILIFTHERE 如果已存在则失败
	STGM_FAILIFTHERE STGM = 0x00000000

	// STGM_DIRECT 直接访问模式,绕过缓冲
	STGM_DIRECT STGM = 0x00000000

	// STGM_TRANSACTED 事务访问模式
	STGM_TRANSACTED STGM = 0x00010000

	// STGM_NOSCRATCH 不使用临时文件
	STGM_NOSCRATCH STGM = 0x00100000

	// STGM_NOSNAPSHOT 不创建快照
	STGM_NOSNAPSHOT STGM = 0x00200000

	// STGM_SIMPLE 简单访问模式
	STGM_SIMPLE STGM = 0x08000000

	// STGM_DIRECT_SWMR 直接单写多读模式
	STGM_DIRECT_SWMR STGM = 0x00400000

	// STGM_DELETEONRELEASE 释放时删除
	STGM_DELETEONRELEASE STGM = 0x04000000
)

type SWP_

type SWP_ uint32

SWP_ 是窗口大小和定位的标志.

const (
	SWP_ASYNCWINDOWPOS SWP_ = 0x4000 // 如果调用线程和拥有窗口的线程连接到不同的输入队列,系统会将请求发布到拥有窗口的线程。这可以防止调用线程在其他线程处理请求时阻塞其执行.
	SWP_DEFERERASE     SWP_ = 0x2000 // 防止生成 WM_SYNCPAINT 消息.
	SWP_DRAWFRAME      SWP_ = 0x0020 // 在窗口周围绘制一个框架(在窗口的类描述中定义).
	SWP_FRAMECHANGED   SWP_ = 0x0020 // 应用使用 SetWindowLong 函数 设置的新框架样式。向窗口发送WM_NCCALCSIZE 消息,即使窗口大小没有改变。如果未指定此标志,则仅在更改窗口大小时发送 WM_NCCALCSIZE .
	SWP_HIDEWINDOW     SWP_ = 0x0080 // 隐藏窗口.
	SWP_NOACTIVATE     SWP_ = 0x0010 // 不激活窗口。如果未设置此标志,则窗口被激活并移动到最顶层或非最顶层组的顶部(取决于 hWndInsertAfter 参数的设置).
	SWP_NOCOPYBITS     SWP_ = 0x0100 // 丢弃客户区的全部内容。如果未指定此标志,则在调整窗口大小或重新定位后,将保存客户区的有效内容并将其复制回客户区.
	SWP_NOMOVE         SWP_ = 0x0002 // 保留当前位置(忽略 X 和 Y 参数).
	SWP_NOOWNERZORDER  SWP_ = 0x0200 // 不改变所有者窗口在 Z 顺序中的位置.
	SWP_NOREDRAW       SWP_ = 0x0008 // 不重绘更改。如果设置了此标志,则不会发生任何类型的重新绘制。这适用于客户区、非客户区(包括标题栏和滚动条)以及由于窗口移动而未覆盖的父窗口的任何部分。设置此标志时,应用程序必须显式地使需要重绘的窗口和父窗口的任何部分无效或重绘.
	SWP_NOREPOSITION   SWP_ = 0x0200 // 与 SWP_NOOWNERZORDER 标志相同.
	SWP_NOSENDCHANGING SWP_ = 0x0400 // 阻止窗口接收 WM_WINDOWPOSCHANGING 消息.
	SWP_NOSIZE         SWP_ = 0x0001 // 保留当前大小(忽略 cx 和 cy 参数).
	SWP_NOZORDER       SWP_ = 0x0004 // 保留当前 Z 顺序(忽略 hWndInsertAfter 参数).
	SWP_SHOWWINDOW     SWP_ = 0x0040 // 显示窗口.
)

type TOUCH_MASK_ added in v1.3.395

type TOUCH_MASK_ uint32

TOUCH_MASK_ 定义触摸输入掩码常量

const (
	TOUCH_MASK_NONE        TOUCH_MASK_ = 0x00000000 // 默认 - 所有可选字段均无效
	TOUCH_MASK_CONTACTAREA TOUCH_MASK_ = 0x00000001 // rcContact 字段有效
	TOUCH_MASK_ORIENTATION TOUCH_MASK_ = 0x00000002 // orientation 字段有效
	TOUCH_MASK_PRESSURE    TOUCH_MASK_ = 0x00000004 // pressure 字段有效
)

type WH_ added in v1.3.391

type WH_ int32
const (
	WH_JOURNALRECORD   WH_ = 0  // 用于记录发布到系统消息队列的输入消息。此挂钩可用于录制宏, win11不支持.
	WH_JOURNALPLAYBACK WH_ = 1  // 该过程发布以前由 WH_JOURNALRECORD 挂钩过程记录的消息, win11不支持.
	WH_KEYBOARD        WH_ = 2  // 安装监视击键消息的挂钩过程.
	WH_GETMESSAGE      WH_ = 3  // 安装用于监视发布到消息队列的消息的挂钩过程.
	WH_CALLWNDPROC     WH_ = 4  // 安装一个挂钩过程,该过程在系统将消息发送到目标窗口过程之前对其进行监视.
	WH_CBT             WH_ = 5  // 安装一个挂钩过程,用于接收对 CBT 应用程序有用的通知.
	WH_SYSMSGFILTER    WH_ = 6  // 安装一个挂钩过程,用于监视由于对话框、消息框、菜单或滚动条中的输入事件而生成的消息。 挂钩过程监视与调用线程相同的桌面中的所有应用程序的消息.
	WH_MOUSE           WH_ = 7  // 安装监视鼠标消息的挂钩过程.
	WH_DEBUG           WH_ = 9  // 安装一个挂钩过程,用于调试其他挂钩过程.
	WH_SHELL           WH_ = 10 // 安装一个挂钩过程,用于接收对 shell 应用程序有用的通知.
	WH_FOREGROUNDIDLE  WH_ = 11 // 安装一个挂钩过程,当应用程序的前景线程即将变为空闲状态时将调用该挂钩过程。 此挂钩可用于在空闲时间执行低优先级任务.
	WH_CALLWNDPROCRET  WH_ = 12 // 安装挂钩过程,该挂钩过程在目标窗口过程处理消息后对其进行监视。 有关详细信息.
	WH_KEYBOARD_LL     WH_ = 13 // 安装监视低级别键盘输入事件的挂钩过程.
	WH_MOUSE_LL        WH_ = 14 // 安装用于监视低级别鼠标输入事件的挂钩过程.
)

type WNDCLASSEX added in v1.3.394

type WNDCLASSEX struct {
	CbSize      uint32  // 此结构的大小(以字节为单位)。 将此成员设置为 sizeof(WNDCLASSEX)。 在调用 GetClassInfoEx 函数之前,请务必设置此成员。
	Style       uint32  // 类样式(s)。 此成员可以是 类样式的任意组合。
	LpfnWndProc uintptr // 指向窗口过程的指针。 必须使用 CallWindowProc 函数来调用窗口过程。 有关详细信息,请参阅 WindowProc。
	CbClsExtra  int32   // 要按照窗口类结构分配的额外字节数。 系统将字节初始化为零。
	CbWndExtra  int32   // 在窗口实例之后分配的额外字节数。 系统将字节初始化为零。 如果应用程序使用 WNDCLASSEX 注册通过使用资源文件中的 CLASS 指令创建的对话框,则必须将此成员设置为 DLGWINDOWEXTRA。
	HInstance   uintptr // 包含类的窗口过程的实例的句柄。
	HIcon       uintptr // 类图标的句柄。 此成员必须是图标资源的句柄。 如果此成员 NULL,则系统提供默认图标。
	HCursor     uintptr // 类游标的句柄。 此成员必须是游标资源的句柄。 如果此成员 NULL,则每当鼠标移动到应用程序的窗口中时,应用程序都必须显式设置光标形状。

	// 类背景画笔的句柄。 此成员可以是用于绘制背景的画笔的句柄,也可以是颜色值。 颜色值必须是以下标准系统颜色之一(值 1 必须添加到所选颜色中)。 如果提供了颜色值,则必须将其转换为以下 HBRUSH 类型之一:
	//
	// 使用 UnregisterClass 注销类时,系统会自动删除类背景画笔。 应用程序不应删除这些画笔。
	//
	// 当此成员 NULL时,每当请求应用程序在其工作区中绘制时,都必须绘制其自己的背景。 若要确定是否必须绘制背景,应用程序可以处理 WM_ERASEBKGND 消息,也可以测试由 beginPaint 函数 填充的 PAINTSTRUCT 结构的 fErase 成员。
	HbrBackground uintptr
	LpszMenuName  uintptr // 指向以 null 结尾的字符串的指针, 使用 common.StrPtr 生成,该字符串指定类菜单的资源名称,因为名称显示在资源文件中。  如果此成员 NULL,则属于此类的窗口没有默认菜单。

	// 指向以 null 结尾的字符串或原子的指针, 使用 common.StrPtr 生成。 如果此参数是 atom,则它必须是上一次调用 RegisterClass 或 RegisterClassEx 函数创建的类 atom。 原子必须位于 lpszClassName 的低序单词中;高序单词必须为零。
	//
	// 如果 lpszClassName 是字符串,则指定窗口类名。 类名称可以是注册到 RegisterClass 或 RegisterClassEx 的任何名称,也可以是预定义的控件类名称。
	//
	// lpszClassName 的最大长度为 256。 如果 lpszClassName 大于最大长度,则 RegisterClassEx 函数将失败。
	LpszClassName uintptr
	HIconSm       uintptr // 与窗口类关联的小图标的句柄。 如果此成员 NULL,系统将搜索由 hIcon 成员指定的图标资源,以获取要用作小图标的相应大小的图标。
}

WNDCLASSEX 包含窗口类信息。它与 RegisterClassEx 和 GetClassInfoEx 函数一起使用。

详情: https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/ns-winuser-wndclassexw.

Directories

Path Synopsis
Package wnd 调用 wapi 封装了对窗口的操作.
Package wnd 调用 wapi 封装了对窗口的操作.
Package wutil 调用 wapi 封装了部分常用功能.
Package wutil 调用 wapi 封装了部分常用功能.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL