wapi

package
v0.0.0-...-48d22b3 Latest Latest
Warning

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

Go to latest
Published: Jun 10, 2022 License: MIT Imports: 8 Imported by: 0

Documentation

Overview

Package wapi 封装了windows系统的api.

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func ChooseColorW

func ChooseColorW(lpcc *ChooseColor) bool

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

@Description 详情: https://docs.microsoft.com/zh-cn/previous-versions/windows/desktop/legacy/ms646912(v=vs.85).
@param lpcc 指向 wapi.ChooseColor 结构的指针,该结构包含用于初始化对话框的信息。当函数返回时,此结构包含有关用户颜色选择的信息。
@return bool
Example
package main

import (
	"fmt"
	"gitee.com/wengo/windows_gui/wapi"
	"unsafe"
)

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) // 如果你添加了自定义颜色, 会保存在这个数组里面, 然后只要这个数组还在, 再次打开选择颜色界面时, 之前添加的自定义颜色还会存在
}
Output:

func ClientToScreen

func ClientToScreen(hWnd int, lpPoint *xc.POINT) bool

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

@Description 详见: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-ClientToScreen.
@param hWnd 窗口真实句柄
@param lpPoint xc.POINT 指针. 如果函数成功,则将新的屏幕坐标复制到此结构中.
@return bool
Example
package main

import (
	"fmt"
	"gitee.com/wengo/windows_gui/app"
	"gitee.com/wengo/windows_gui/wapi"
	"gitee.com/wengo/windows_gui/window"
	"gitee.com/wengo/windows_gui/xc"
	"gitee.com/wengo/windows_gui/xcc"
)

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

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

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

func CloseClipboard

func CloseClipboard() bool

CloseClipboard 关闭剪贴板.

@Description 当窗口完成检查或更改剪贴板时,通过调用 CloseClipboard 关闭剪贴板。这使其他窗口能够访问剪贴板.
详见: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-CloseClipboard.
@return bool

func CloseHandle

func CloseHandle(handle int) int

CloseHandle 关闭一个内核对象.

@param handle 对象句柄.
@return int

func DragFinish

func DragFinish(hDrop int)

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

@Description 详见: https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-DragFinish.
@param hDrop 句柄.

func DragQueryFileW

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

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

@Description 详见: https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-DragQueryFileW.
@param hDrop 句柄.
@param iFile 文件索引.
@param lpszFile 返回的文件路径.
@param cch 接收的文件路径的字符数, 通常为260.
@return int 返回文件路径的字符数.

func DragQueryPoint

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

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

@Description 详见: https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-DragQueryPoint.
@param hDrop 句柄.
@param ppt 接收鼠标指针的坐标.
@return bool 如果拖放发生在窗口的客户区, 返回true;否则返回false.

func EmptyClipboard

func EmptyClipboard() bool

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

@Description 在调用 EmptyClipboard 之前,应用程序必须使用 OpenClipboard 函数打开剪贴板。
如果应用程序在打开剪贴板时指定了NULL窗口句柄,则 EmptyClipboard 会成功,但会将剪贴板所有者设置为NULL。请注意,这会导致 SetClipboardData 失败。
详见: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-EmptyClipboard.
@return bool

func FindWindowExW

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

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

@Description 详见: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-FindWindowExW.
@param hWndParent 要搜索其子窗口的父窗口的句柄. 如果hwndParent为0,该函数使用桌面窗口作为父窗口. 该函数在作为桌面子窗口的窗口中进行搜索.
@param hWndChildAfter 子窗口的句柄。搜索从 Z 顺序中的下一个子窗口开始。子窗口必须是hwndParent的直接子窗口,而不仅仅是后代窗口。 如果hwndChildAfter为0,则搜索从hwndParent的第一个子窗口开始。 请注意,如果hwndParent和hwndChildAfter都是0,则该函数将搜索所有顶级和仅消息窗口。
@param lpszClass 窗口类名, 可空.
@param lpszWindow 窗口名称(窗口的标题), 可空.
@return int
Example
package main

import (
	"fmt"
	"gitee.com/wengo/windows_gui/wapi"
)

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

func GetClipboardData

func GetClipboardData(uFormat CF_) uintptr

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

@Description 详见: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-GetClipboardData.
@param uFormat 剪贴板格式, wapi.CF_ .
@return uintptr 如果函数成功,则返回值是指定格式的剪贴板对象的句柄. 如果函数失败,则返回值为NULL.

func GetClipboardText

func GetClipboardText() (string, error)

GetClipboardText 获取剪贴板中的文本.

@return string
@return error

func GetDesktopWindow

func GetDesktopWindow() int

GetDesktopWindow 获取桌面窗口的句柄.

@Description 详见: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-GetDesktopWindow.
@return int

func GetOpenFileNameW

func GetOpenFileNameW(unnamedParam1 *OpenFileNameW) bool

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

@Description 详情: https://docs.microsoft.com/zh-cn/windows/win32/api/commdlg/nf-commdlg-getopenfilenamew.
@param unnamedParam1 指向包含用于初始化对话框的信息的 wapi.OpenFileNameW 结构的指针。当函数返回时,此结构包含有关用户文件选择的信息。
@return bool
Example
package main

import (
	"fmt"
	"gitee.com/wengo/windows_gui/common"
	"gitee.com/wengo/windows_gui/wapi"
	"strings"
	"syscall"
	"unsafe"
)

func main() {
	// 多个过滤器, 打开单个文件.
	c := "\x00"
	lpstrFilter := strings.Join([]string{"Text Files(*txt)", "*.txt", "All Files(*.*)", "*.*"}, c) + c + c

	lpstrFile := make([]uint16, 260)
	lpstrFileTitle := make([]uint16, 260)

	ofn := wapi.OpenFileNameW{
		LStructSize:       76,
		HwndOwner:         0,
		HInstance:         0,
		LpstrFilter:       common.StringToUint16Ptr(lpstrFilter),
		LpstrCustomFilter: nil,
		NMaxCustFilter:    0,
		NFilterIndex:      1,
		LpstrFile:         &lpstrFile[0],
		NMaxFile:          260,
		LpstrFileTitle:    &lpstrFileTitle[0],
		NMaxFileTitle:     260,
		LpstrInitialDir:   common.StrPtr("D:"),
		LpstrTitle:        common.StrPtr("打开文件"),
		Flags:             wapi.OFN_PATHMUTEXIST, // 用户只能键入有效的路径和文件名
		NFileOffset:       0,
		NFileExtension:    0,
		LpstrDefExt:       0,
		LCustData:         0,
		LpfnHook:          0,
		LpTemplateName:    0,
	}
	ofn.LStructSize = uint32(unsafe.Sizeof(ofn))
	ret := wapi.GetOpenFileNameW(&ofn)
	fmt.Println(ret)
	fmt.Println("lpstrFile:", syscall.UTF16ToString(lpstrFile))
	fmt.Println("lpstrFileTitle:", syscall.UTF16ToString(lpstrFileTitle))
}
Output:

func GetSaveFileNameW

func GetSaveFileNameW(unnamedParam1 *OpenFileNameW) bool

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

@Description 详情: https://docs.microsoft.com/zh-cn/windows/win32/api/commdlg/nf-commdlg-GetSaveFileNameW.
@param unnamedParam1 指向包含用于初始化对话框的信息的 wapi.OpenFileNameW 结构的指针。当函数返回时,此结构包含有关用户文件选择的信息。
@return bool
Example
package main

import (
	"fmt"
	"gitee.com/wengo/windows_gui/common"
	"gitee.com/wengo/windows_gui/wapi"
	"strings"
	"syscall"
	"unsafe"
)

func main() {
	// 多个过滤器, 保存文件.
	c := "\x00"
	lpstrFilter := strings.Join([]string{"Text Files(*txt)", "*.txt", "All Files(*.*)", "*.*"}, c) + c + c

	lpstrFile := make([]uint16, 260)
	lpstrFileTitle := make([]uint16, 260)

	ofn := wapi.OpenFileNameW{
		LStructSize:       76,
		HwndOwner:         0,
		HInstance:         0,
		LpstrFilter:       common.StringToUint16Ptr(lpstrFilter),
		LpstrCustomFilter: nil,
		NMaxCustFilter:    0,
		NFilterIndex:      1,
		LpstrFile:         &lpstrFile[0],
		NMaxFile:          260,
		LpstrFileTitle:    &lpstrFileTitle[0],
		NMaxFileTitle:     260,
		LpstrInitialDir:   common.StrPtr("D:"),
		LpstrTitle:        common.StrPtr("保存文件"),
		Flags:             wapi.OFN_OVERWRITEPROMPT, // 如果所选文件已存在,则使“另存为”对话框生成一个消息框。用户必须确认是否覆盖文件。
		NFileOffset:       0,
		NFileExtension:    0,
		LpstrDefExt:       common.StrPtr("txt"), // 如果用户没有输入文件扩展名, 则默认使用这个
		LCustData:         0,
		LpfnHook:          0,
		LpTemplateName:    0,
	}
	ofn.LStructSize = uint32(unsafe.Sizeof(ofn))
	ret := wapi.GetSaveFileNameW(&ofn)
	fmt.Println(ret)
	fmt.Println("lpstrFile:", syscall.UTF16ToString(lpstrFile))
	fmt.Println("lpstrFileTitle:", syscall.UTF16ToString(lpstrFileTitle))
}
Output:

func GetWindowTextLengthW

func GetWindowTextLengthW(hWnd int) int

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

@Description 详见: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-GetWindowTextLengthW.
@param hWnd 窗口或控件的句柄。
@return int 如果成功,则返回值是文本的长度(以字符为单位)。在某些情况下,此值可能大于文本的长度。如果窗口没有文本,则返回值为零。

func GetWindowTextW

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

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

@Description 详见: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-GetWindowTextW.
@param hWnd 包含文本的窗口或控件的句柄。
@param lpString 接收文本.
@param nMaxCount 复制到缓冲区的最大字符数,包括空字符。如果文本超出此限制,则将其截断.
@return int 如果函数成功,则返回值是复制字符串的长度(以字符为单位),不包括终止空字符。如果窗口没有标题栏或文本,如果标题栏为空,或者窗口或控制句柄无效,则返回值为零。

func GlobalAlloc

func GlobalAlloc(uFlags GMEM_, dwBytes uint64) uintptr

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

@Description 详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-GlobalAlloc.
@param uFlags 内存分配属性。如果指定为零,则默认为 GMEM_Fixed. 该参数可以是以下值中的一个或多个: wapi.GMEM_ .
@param dwBytes 要分配的字节数。如果此参数为0并且uFlags参数指定 GMEM_Moveable ,则该函数返回标记为已丢弃的内存对象的句柄.
@return uintptr 如果函数成功,则返回值是新分配的内存对象的句柄. 如果函数失败,则返回值为NULL.

func GlobalFree

func GlobalFree(hMem uintptr) uintptr

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

@Description 详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-GlobalFree.
@param hMem 全局内存对象的句柄. 此句柄由 GlobalAlloc 或 GlobalReAlloc 函数返回. 释放使用 LocalAlloc 分配的内存是不安全的.
@return uintptr 如果函数成功, 则返回值为NULL. 如果函数失败, 则返回值等于全局内存对象的句柄.

func GlobalLock

func GlobalLock(hMem uintptr) uintptr

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

@Description 详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-GlobalLock.
@param hMem 全局内存对象的句柄。此句柄由 GlobalAlloc 或 GlobalReAlloc 函数返回.
@return uintptr 如果函数成功,则返回值是指向内存块第一个字节的指针. 如果函数失败,则返回值为NULL.

func GlobalSize

func GlobalSize(hMem uintptr) uint64

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

@Description 内存块的大小可能大于分配内存时请求的大小. 要验证指定对象的内存块是否未被丢弃, 请在调用 GlobalSize 之前使用 GlobalFlags 函数.
详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-GlobalSize.
@param hMem 全局内存对象的句柄。此句柄由 GlobalAlloc 或 GlobalReAlloc 函数返回.
@return uint64 如果函数成功,则返回值是指定全局内存对象的大小,以字节为单位. 如果指定的句柄无效或对象已被丢弃,则返回值为0.

func GlobalUnlock

func GlobalUnlock(hMem uintptr) bool

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

@Description 详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-GlobalUnlock.
@param hMem 全局内存对象的句柄。此句柄由 GlobalAlloc 或 GlobalReAlloc 函数返回.
@return bool

func IsClipboardFormatAvailable

func IsClipboardFormatAvailable(uFormat CF_) bool

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

@Description 详见: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-IsClipboardFormatAvailable.
@param uFormat 标准或注册的剪贴板格式, wapi.CF_ .
@return bool

func LstrcpyW

func LstrcpyW(lpString1, lpString2 uintptr) uintptr

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

@Description 详情: https://docs.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-LstrcpyW.
@param lpString1 用于接收 lpString2 参数指向的字符串内容的缓冲区. 缓冲区必须足够大以包含字符串,包括终止空字符.
@param lpString2 要复制的以 null 结尾的字符串.
@return uintptr 如果函数成功,则返回值是指向缓冲区的指针. 如果函数失败,则返回值为NULL, 并且lpString1可能不是以 null 结尾的.

func OpenClipboard

func OpenClipboard(hWnd int) bool

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

@Description 如果另一个窗口打开了剪贴板,则 OpenClipboard 会失败.
应用程序应在每次成功调用 OpenClipboard 后调用 CloseClipboard 函数.
除非调用 EmptyClipboard 函数,否则由hWndNewOwner参数标识的窗口不会成为剪贴板所有者.
如果应用程序在 hwnd 设置为0的情况下调用 OpenClipboard, EmptyClipboard 会将剪贴板所有者设置为NULL;这会导致 SetClipboardData 失败.
详见: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-OpenClipboard.
@param hWnd 要与打开的剪贴板关联的窗口句柄。如果此参数为0,则打开的剪贴板与当前任务相关联.
@return bool

func RtlMoveMemory

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

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

@Description 详情: https://docs.microsoft.com/zh-cn/windows/win32/devnotes/rtlmovememory.
@param Destination 指向要复制字节的目标内存块的指针.
@param Source 指向要复制字节的源内存块的指针.
@param Length 从源复制到目标中的字节数.

func SHBrowseForFolderW

func SHBrowseForFolderW(browseInfo *BrowseInfoW) uintptr

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

@Description 详见: https://docs.microsoft.com/zh-cn/windows/win32/api/shlobj_core/nf-shlobj_core-shbrowseforfolderw.
@param browseInfo 指向 wapi.BrowseInfoW 结构的指针,该结构包含用于显示对话框的信息。
@return uintptr 返回一个 PIDL,它指定所选文件夹相对于命名空间根的位置。如果用户在对话框中选择取消按钮,则返回值为NULL。返回的 PIDL 可能是文件夹快捷方式而不是文件夹。
Example
package main

import (
	"fmt"
	"gitee.com/wengo/windows_gui/common"
	"gitee.com/wengo/windows_gui/wapi"
	"syscall"
)

func main() {
	buf := make([]uint16, 260)
	bi := wapi.BrowseInfoW{
		HwndOwner:      0,
		PidlRoot:       0,
		PszDisplayName: common.Uint16SliceDataPtr(&buf),
		LpszTitle:      common.StrPtr("显示在对话框中树视图控件上方的文本"),
		UlFlags:        1,
		Lpfn:           0,
		LParam:         0,
		IImage:         0,
	}
	var pszPath string
	wapi.SHGetPathFromIDListW(wapi.SHBrowseForFolderW(&bi), &pszPath)
	fmt.Println("pszPath:", pszPath)                           // 用户选择的文件夹完整路径
	fmt.Println("PszDisplayName:", syscall.UTF16ToString(buf)) // 用户选择的文件夹的名称
}
Output:

func SHGetPathFromIDListW

func SHGetPathFromIDListW(pidl uintptr, pszPath *string) bool

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

@Description 详见: https://docs.microsoft.com/zh-cn/windows/win32/api/shlobj_core/nf-shlobj_core-shgetpathfromidlistw.
@param pidl SHBrowseForFolderW 的返回值.
@param pszPath 返回的文件路径。
@return bool
Example
package main

import (
	"fmt"
	"gitee.com/wengo/windows_gui/common"
	"gitee.com/wengo/windows_gui/wapi"
	"syscall"
)

func main() {
	buf := make([]uint16, 260)
	bi := wapi.BrowseInfoW{
		HwndOwner:      0,
		PidlRoot:       0,
		PszDisplayName: common.Uint16SliceDataPtr(&buf),
		LpszTitle:      common.StrPtr("显示在对话框中树视图控件上方的文本"),
		UlFlags:        wapi.BIF_USENEWUI,
		Lpfn:           0,
		LParam:         0,
		IImage:         0,
	}
	var pszPath string
	wapi.SHGetPathFromIDListW(wapi.SHBrowseForFolderW(&bi), &pszPath)
	fmt.Println("pszPath:", pszPath)                           // 用户选择的文件夹完整路径
	fmt.Println("PszDisplayName:", syscall.UTF16ToString(buf)) // 用户选择的文件夹的名称
}
Output:

func SetClipboardData

func SetClipboardData(uFormat CF_, hMem uintptr) uintptr

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

@Description 详见: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-setclipboarddata.
@param uFormat 标准或注册的剪贴板格式, wapi.CF_ .
@param hMem 指定格式的数据的句柄。该参数可以为0,表示窗口根据请求提供指定剪贴板格式的数据(渲染格式).
@return uintptr 如果函数成功,则返回值是数据的句柄. 如果函数失败,则返回值为NULL.

func SetClipboardText

func SetClipboardText(text string) error

SetClipboardText 将文本置入剪贴板.

@param text 要置入的文本.
@return error

func SetForegroundWindow

func SetForegroundWindow(hWnd int) bool

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

@Description 详见: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-SetForegroundWindow.
@param hWnd 应激活并置于前台的窗口句柄.
@return bool

func SetWindowPos

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

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

@Description 详见: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-SetWindowPos.
@param hWnd 欲定位的窗口句柄.
@param hWndInsertAfter 在Z序中位于定位窗口之前的窗口句柄. 此参数必须是窗口句柄或以下值之一: wapi.HWND_.
@param x 窗口新的x坐标。如hwnd是一个子窗口,则x用父窗口的客户区坐标表示.
@param y 窗口新的y坐标。如hwnd是一个子窗口,则y用父窗口的客户区坐标表示.
@param cx 指定新的窗口宽度.
@param cy 指定新的窗口高度.
@param wFlags 窗口大小和定位的标志. 该参数可以是以下值的组合: wapi.SWP_.
@return bool

func ShellExecuteW

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

ShellExecuteW 对指定文件执行操作.

@Description 详见: https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shellexecutew.
@param hwnd 用于显示 UI 或错误消息的父窗口的句柄。如果操作与窗口无关,则此值可以为0.
@param lpOperation 填“open”则打开lpFlie文档.
@param lpFile 想用关联的程序打印或打开的一个程序名或文件名.
@param lpParameters 如果lpFile是一个可执行文件,则这个字串包含了传递给执行程序的参数.
@param lpDirectory 想使用的默认路径完整路径.
@param nShowCmd 定义了如何显示启动程序的常数值, xcc.SW_.
@return int 如果函数成功,则返回大于32的值。如果函数失败,则返回指示失败原因的错误值.
Example
package main

import (
	"gitee.com/wengo/windows_gui/wapi"
	"gitee.com/wengo/windows_gui/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)
}
Output:

func Sleep

func Sleep(ms int) int

Sleep 延时.

@param ms 毫秒.
@return int

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      int     // 父窗口句柄
	PidlRoot       uintptr // 指定开始浏览的根文件夹的位置。只有命名空间层次结构中的指定文件夹及其子文件夹出现在对话框中。该成员可以为NULL;在这种情况下,将使用默认位置.
	PszDisplayName uintptr // 指向缓冲区的指针,用于接收用户选择的文件夹的显示名称。此缓冲区的大小假定为 260 个字符.
	LpszTitle      uintptr // 指向显示在对话框中树视图控件上方的以空字符结尾的字符串的指针。使用 common.StrPtr()函数生成.
	UlFlags        BIF_    // 指定对话框选项的标志。可以为0,也可以是 wapi.BIF_ 的组合.
	Lpfn           uintptr // 指向应用程序定义函数的指针,当事件发生时对话框调用该函数.
	LParam         uintptr // 对话框传递给回调函数的应用程序定义的值(如果在lpfn中指定) .
	IImage         int32   // 接收与所选文件夹关联的图像索引,存储在系统图像列表中。
}

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

@Description 详见: 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

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

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

	// 如果设置了 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 int, lpText, lpCaption string, uType MB_) ID_

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

@Description 详见: https://docs.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-MessageBoxW.
@param hWnd 要创建的消息框的所有者窗口的句柄。如果此参数为0,则消息框没有所有者窗口.
@param lpText 要显示的消息。如果字符串由多行组成,您可以在每行之间使用换行符分隔各行.
@param lpCaption 对话框标题。如果此参数为空,则默认标题为Error.
@param uType 对话框的内容和行为, 是以下值的组合: wapi.MB_.
@return wapi.ID_ 如果函数失败,则返回值为0; 成功则返回一个整数,指示用户单击了哪个按钮.
Example
package main

import (
	"fmt"
	"gitee.com/wengo/windows_gui/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)
	}
}
Output:

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参数必须为NULL。这是为了使消息框可以出现在与hWnd对应的桌面以外的桌面上。有关使用此标志的安全注意事项的信息,请参阅交互式服务。特别要注意,此标志可以在锁定的桌面上生成交互式内容,因此只能用于非常有限的一组场景,例如资源耗尽。
)

type OFN_

type OFN_ uint32

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

type OpenFileNameW

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

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

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

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

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

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

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

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

	// 初始目录.
	//	例: common.StrPtr("D:").
	LpstrInitialDir uintptr

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

	// 标志: 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并且用户未能键入扩展名,则不会附加任何扩展名。
	//
	//	例子: common.StrPtr("txt")
	LpstrDefExt uintptr

	// 系统传递给由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 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 // 显示窗口。
)

Jump to

Keyboard shortcuts

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