wapi

package
v1.3.393 Latest Latest
Warning

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

Go to latest
Published: Jan 24, 2025 License: MIT Imports: 5 Imported by: 36

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 (
	// 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 WHEEL_DELTA int16 = 120

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

Variables

This section is empty.

Functions

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() {
	a := app.New(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 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 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 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 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 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 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 函数在返回之前不会等待消息发布.

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

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

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

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

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

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

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 GetSaveFileNameW

func GetSaveFileNameW(unnamedParam1 *OpenFileNameW) bool

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

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

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

func GetWindowLongPtrW added in v1.3.393

func GetWindowLongPtrW(hWnd uintptr, nIndex int32) int

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

详情: 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 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 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 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 LoadImageW added in v1.3.381

func LoadImageW(hInst uintptr, name 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.

name: 要加载的图像。如果 hInst 参数为非0且 fuLoad 参数省略 LR_LOADFROMFILE, 则 name 指定 hInst 模块中的图像资源。如果要按名称从模块加载图像资源, 则 name 参数是指向包含映像资源名称的字符串. 如果要传字符串请用: 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 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 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 PostMessageW added in v1.3.360

func PostMessageW(hWnd uintptr, Msg int32, 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 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参数可以是以下值的组合: xcc.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 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 int32, 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 SetForegroundWindow

func SetForegroundWindow(hWnd uintptr) bool

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

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

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

func SetWindowLongPtrW added in v1.3.393

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

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

详情: 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 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 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: 要释放的热键的标识符.

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 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 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 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 Mod_ added in v1.3.360

type Mod_ uint32
const (
	Mod_Alt      Mod_ = 0x0001 // 必须按住任一 ALT 键.
	Mod_Control  Mod_ = 0x0002 // 必须按住任一 CTRL 键.
	Mod_Norepeat Mod_ = 0x4000 // 更改热键行为,以便键盘自动重复不会产生多个热键通知。Windows Vista:  不支持此标志.
	Mod_Shift    Mod_ = 0x0004 // 必须按住任一 SHIFT 键.
	Mod_Win      Mod_ = 0x0008 // 任一 WINDOWS 键被按住。这些键标有 Windows 徽标。涉及 WINDOWS 键的键盘快捷键保留供操作系统使用.
)

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 POINT added in v1.3.380

type POINT struct {
	X int32
	Y int32
}

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 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 // 安装用于监视低级别鼠标输入事件的挂钩过程.
)

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