wutil

package
v1.3.399 Latest Latest
Warning

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

Go to latest
Published: Jan 9, 2026 License: MIT Imports: 14 Imported by: 12

Documentation

Overview

Package wutil 调用 wapi 封装了部分常用功能.

Index

Examples

Constants

View Source
const (
	ModePlaying = "playing" // 正在播放
	ModePaused  = "paused"  // 已暂停
	ModeStopped = "stopped" // 已停止
	ModeOpen    = "open"    // 设备已打开但未播放
	ModeSeeking = "seeking" // 正在寻址
	ModeReady   = "ready"   // 设备就绪
	ModeUnknown = "unknown" // 获取播放模式失败
	ModeEmpty   = ""        // 设备未打开, 就是没有调用 Open()
)

Variables

This section is empty.

Functions

func CallNextHookEx_Keyboard added in v1.3.391

func CallNextHookEx_Keyboard(nCode int32, wParam xcc.WM_, lParam *wapi.KBDLLHOOKSTRUCT) uintptr

CallNextHookEx_Keyboard 用于 NewHookKeyboard 的参数 KeyboardProc 回调函数的返回值.

  • 在回调函数中放行键盘消息应该 return wutil.CallNextHookEx_Keyboard(nCode, wParam, lParam). 拦截键盘消息应该 return 1.

func CallNextHookEx_Mouse added in v1.3.391

func CallNextHookEx_Mouse(nCode int32, wParam xcc.WM_, lParam *wapi.MSLLHOOKSTRUCT) uintptr

CallNextHookEx_Mouse 用于 NewHookMouse 的参数 MouseProc 回调函数的返回值.

  • 在回调函数中放行鼠标消息应该 return wutil.CallNextHookEx_Mouse(nCode, wParam, lParam). 拦截鼠标消息应该 return 1.

func ChooseColor

func ChooseColor(hParent int) uint32

ChooseColor 选择颜色. 返回rgb颜色.

hParent: 父炫彩窗口句柄, 可为0.

func GetClipboardText

func GetClipboardText() (string, error)

GetClipboardText 获取剪贴板中的文本.

func GetDropFiles

func GetDropFiles(hDropInfo uintptr) []string

GetDropFiles 获取拖放进来的文件.

hDropInfo: 拖放信息句柄.

func GetHigh16Bits added in v1.3.391

func GetHigh16Bits(value int32) int16

GetHigh16Bits 获取 int32 的高16位.

func GetLow16Bits added in v1.3.391

func GetLow16Bits(value int32) int16

GetLow16Bits 获取 int32 的低16位.

func GetScreenHeight added in v1.3.394

func GetScreenHeight() int32

GetScreenHeight 取屏幕高度.

func GetScreenWidth added in v1.3.394

func GetScreenWidth() int32

GetScreenWidth 取屏幕宽度.

func GetWindows added in v1.3.394

func GetWindows(pid ...int) []uintptr

GetWindows 枚举指定进程的所有窗口句柄.

pid: 进程ID, 如果填-1, 则使用当前进程id. 如果填0, 则枚举所有进程的窗口句柄.

func HIcon added in v1.3.392

func HIcon(iconPath string) uintptr

HIcon 从文件加载图标. 返回 HICON 句柄.

  • 可用于需要 HICON 句柄的函数, 如设置托盘图标.
  • 如果失败, 可使用 syscall.GetLastError() 获取错误信息.
  • 当图标句柄不再使用时, 可使用 wapi.DestroyIcon 函数释放.

iconPath: 图标路径.

func IsComboKey added in v1.3.395

func IsComboKey(mainKey int32, modifierKeys ...int32) bool

IsComboKey 判断组合键是否按下.

func IsKeyPressed added in v1.3.395

func IsKeyPressed(vkCode int32) bool

IsKeyPressed 使用 wapi.GetAsyncKeyState 判断按键是否按下.

vkCode: 按键的虚拟键码. xcc.VK_ .

func OpenDir

func OpenDir(hParent int) string

OpenDir 打开文件夹. 返回选择的文件夹完整路径.

hParent: 父炫彩窗口句柄, 可为0.

func OpenFile

func OpenFile(hParent int, filters []string, defaultDir string) string

OpenFile 打开单个文件. 返回文件完整路径.

hParent: 父炫彩窗口句柄, 可为0.

filters: 过滤器数组, 两个成员为一个过滤器, 前面是过滤器描述, 后面是过滤器类型. 填nil则不显示任何过滤器. 例: []string{"Text Files(*.txt)", "*.txt", "All Files(*.*)", "*.*"}.

defaultDir: 初始目录, 即默认打开的目录.

func OpenFileEx added in v1.3.393

func OpenFileEx(opt OpenFileOption) []string

OpenFileEx 打开单个或多个文件. 返回文件完整路径数组. 注意:

  • 打开多个文件时, 需要填 OpenFileOption 中的 Flags 字段.
  • 如果用户选择了超级多个文件, 可能会超过缓冲区大小, 一旦超过了缓冲区的大小, 会返回nil, 且 wapi.CommDlgExtendedError() == wapi.FNERR_BUFFERTOOSMALL

func OpenFiles

func OpenFiles(hParent int, filters []string, defaultDir string) []string

OpenFiles 打开多个文件. 返回文件完整路径数组. 注意:

  • 如果用户选择了超级多个文件, 可能会超过缓冲区大小, 一旦超过了缓冲区的大小, 会返回nil, 且 wapi.CommDlgExtendedError() == wapi.FNERR_BUFFERTOOSMALL

hParent: 父炫彩窗口句柄, 可为0.

filters: 过滤器数组, 两个成员为一个过滤器, 前面是过滤器描述, 后面是过滤器类型. 填nil则不显示任何过滤器. 例: []string{"Text Files(*.txt)", "*.txt", "All Files(*.*)", "*.*"}.

defaultDir: 初始目录, 即默认打开的目录.

func SaveFile

func SaveFile(hParent int, filters []string, defaultDir, defaultFileName string) string

SaveFile 保存文件. 返回文件完整路径.

hParent: 父炫彩窗口句柄, 可为0.

filters: 过滤器数组, 每两个成员为一个过滤器, 前面是过滤器描述, 后面是过滤器类型. 填nil则不显示任何过滤器. 例: []string{"Text Files(*.txt)", "*.txt", "All Files(*.*)", "*.*"}.

defaultDir: 初始目录, 即默认打开的目录.

defaultFileName: 默认文件名.

func SaveFileEx added in v1.3.393

func SaveFileEx(opt OpenFileOption) string

SaveFileEx 保存文件. 返回文件完整路径.

func SetClipboardText

func SetClipboardText(text string) error

SetClipboardText 将文本置入剪贴板.

text: 要置入的文本.

Types

type AudioPlayer added in v1.3.399

type AudioPlayer struct {
	// Alias 音频别名.
	//   - 这是在 Open() 时内部指定的.
	//   - 可用于自行调用 MCI 命令.
	Alias string
}

AudioPlayer 音频播放器.

  • 注意: 尽量在调用 Open() 的线程调用其它方法.
  • 尽可能统一在 UI 线程调用, 否则可能调用失败.

func NewAudioPlayer added in v1.3.399

func NewAudioPlayer() *AudioPlayer

NewAudioPlayer 创建音频播放器.

func (*AudioPlayer) CanPlay added in v1.3.399

func (ap *AudioPlayer) CanPlay() bool

CanPlay 是否可以开始播放.

func (*AudioPlayer) Close added in v1.3.399

func (ap *AudioPlayer) Close() error

Close 关闭音频设备.

func (*AudioPlayer) GetLength added in v1.3.399

func (ap *AudioPlayer) GetLength() (int, error)

GetLength 获取音频长度 (毫秒).

func (*AudioPlayer) GetPlaybackMode added in v1.3.399

func (ap *AudioPlayer) GetPlaybackMode() (string, error)

GetPlaybackMode 获取播放模式.

返回值: 播放模式字符串, 对应 Mode 开头的常量, 如: ModePlaying.

func (*AudioPlayer) GetPosition added in v1.3.399

func (ap *AudioPlayer) GetPosition() (int, error)

GetPosition 获取当前播放位置 (毫秒).

func (*AudioPlayer) GetVolume added in v1.3.399

func (ap *AudioPlayer) GetVolume() (int, error)

GetVolume 获取音量.

func (*AudioPlayer) IsPaused added in v1.3.399

func (ap *AudioPlayer) IsPaused() bool

IsPaused 是否已暂停.

func (*AudioPlayer) IsPlaying added in v1.3.399

func (ap *AudioPlayer) IsPlaying() bool

IsPlaying 是否正在播放.

func (*AudioPlayer) IsStopped added in v1.3.399

func (ap *AudioPlayer) IsStopped() bool

IsStopped 是否已停止.

func (*AudioPlayer) Open added in v1.3.399

func (ap *AudioPlayer) Open(fileName string) error

Open 打开音频文件.

  • 不再使用时需调用 Close() 以释放系统资源.

fileName: 文件路径.

func (*AudioPlayer) Pause added in v1.3.399

func (ap *AudioPlayer) Pause() error

Pause 暂停播放.

  • 暂停后可以调用 Resume() 恢复播放.

func (*AudioPlayer) Play added in v1.3.399

func (ap *AudioPlayer) Play(opts ...PlayOptions) error

Play 播放音频文件.

  • 注意: 它是在当前位置开始播放.
  • 已经播放完的音频, 位置是在结尾. 想回到开头, 请先使用 SeekToStart(), 或者将 PlayOptions.SeekToStart 设置为 true, 每次都从头播放.

opts: 播放选项.

func (*AudioPlayer) Resume added in v1.3.399

func (ap *AudioPlayer) Resume() error

Resume 恢复播放.

func (*AudioPlayer) Seek added in v1.3.399

func (ap *AudioPlayer) Seek(positionMs int) error

Seek 跳转到指定位置.

positionMs: 跳转位置 (毫秒).

func (*AudioPlayer) SeekPercent added in v1.3.399

func (ap *AudioPlayer) SeekPercent(percent float64) error

SeekPercent 按百分比跳转.

percent: 百分比, 0.0 - 1.0.

func (*AudioPlayer) SeekRelative added in v1.3.399

func (ap *AudioPlayer) SeekRelative(offsetMs int) error

SeekRelative 相对当前位置跳转.

offsetMs: 相对位置 (毫秒), 正数向前,负数向后.

func (*AudioPlayer) SeekToEnd added in v1.3.399

func (ap *AudioPlayer) SeekToEnd() error

SeekToEnd 跳转到结尾.

func (*AudioPlayer) SeekToStart added in v1.3.399

func (ap *AudioPlayer) SeekToStart() error

SeekToStart 跳转到开头.

func (*AudioPlayer) SetVolume added in v1.3.399

func (ap *AudioPlayer) SetVolume(volume int) error

SetVolume 设置音量, 不支持某些音频格式.

volume: 音量范围, 0-1000.

func (*AudioPlayer) Stop added in v1.3.399

func (ap *AudioPlayer) Stop() error

Stop 停止播放.

type HookKeyboard added in v1.3.391

type HookKeyboard struct {
	Handle uintptr // 钩子句柄.
}

HookKeyboard 全局键盘钩子.

func NewHookKeyboard added in v1.3.391

func NewHookKeyboard(KeyboardProc wapi.LowLevelKeyboardProc) *HookKeyboard

NewHookKeyboard 创建一个全局键盘钩子, 可用于监听全局键盘消息, 失败返回nil.

KeyboardProc: 回调函数, 可接收键盘消息. 在回调函数中放行键盘消息应该 return wutil.CallNextHookEx_Keyboard(nCode, wParam, lParam). 拦截键盘消息应该 return 1.

Example
package main

import (
	"fmt"
	"github.com/twgh/xcgui/app"
	"github.com/twgh/xcgui/tf"
	"github.com/twgh/xcgui/wapi"
	"github.com/twgh/xcgui/wapi/wutil"
	"github.com/twgh/xcgui/widget"
	"github.com/twgh/xcgui/window"
	"github.com/twgh/xcgui/xcc"
)

func main() {
	tf.TFunc(func(a *app.App, w *window.Window) {
		widget.NewShapeText(40, 40, 300, 30, "在任何窗口按键都能够监听到", w.Handle)
		widget.NewEdit(40, 80, 300, 30, w.Handle).SetFocus()
		checkBtn := widget.NewButton(40, 120, 300, 30, "拦截A键按下", w.Handle).SetTypeEx(xcc.Button_Type_Check)
		checkBtn.EnableBkTransparent(true)

		kbHook := wutil.NewHookKeyboard(func(nCode int32, wParam xcc.WM_, lParam *wapi.KBDLLHOOKSTRUCT) uintptr {
			if nCode < 0 { // nCode小于0时不应继续处理
				return wutil.CallNextHookEx_Keyboard(nCode, wParam, lParam)
			}

			if wParam == xcc.WM_KEYDOWN { // 键盘按下
				if checkBtn.GetStateEx() == xcc.Button_State_Check {
					if lParam.VkCode == xcc.VK_A {
						fmt.Println("拦截了A键按下, 是不会输入文本框的, 部分程序不会被拦截, 自行研究")
						return 1 // 返回1可拦截, 这时按下A键是不会输入文本框的, 部分程序不会被拦截, 因为它可能进行了特殊处理
					}
				}
				fmt.Printf("按键按下: 虚拟键码=%d, 扫描码=%d\n", lParam.VkCode, lParam.ScanCode)
			} else if wParam == xcc.WM_KEYUP { // 键盘弹起
				fmt.Printf("按键弹起: 虚拟键码=%d, 扫描码=%d\n", lParam.VkCode, lParam.ScanCode)
			}
			return wutil.CallNextHookEx_Keyboard(nCode, wParam, lParam)
		})

		w.Event_CLOSE(func(pbHandled *bool) int {
			kbHook.Unhook()
			return 0
		})
	})
}

func (*HookKeyboard) Unhook added in v1.3.391

func (h *HookKeyboard) Unhook() bool

Unhook 卸载全局键盘钩子.

type HookMouse added in v1.3.391

type HookMouse struct {
	Handle uintptr // 钩子句柄.
}

HookMouse 全局鼠标钩子.

func NewHookMouse added in v1.3.391

func NewHookMouse(MouseProc wapi.LowLevelMouseProc) *HookMouse

创建一个全局键盘钩子, 可用于监听全局键盘消息, 失败返回nil.

MouseProc: 回调函数, 可接收鼠标消息. 在回调函数中放行鼠标消息应该 return wutil.CallNextHookEx_Mouse(nCode, wParam, lParam). 拦截鼠标消息应该 return 1.

Example
package main

import (
	"fmt"
	"github.com/twgh/xcgui/app"
	"github.com/twgh/xcgui/tf"
	"github.com/twgh/xcgui/wapi"
	"github.com/twgh/xcgui/wapi/wutil"
	"github.com/twgh/xcgui/widget"
	"github.com/twgh/xcgui/window"
	"github.com/twgh/xcgui/xc"
	"github.com/twgh/xcgui/xcc"
)

func main() {
	tf.TFunc(func(a *app.App, w *window.Window) {
		widget.NewShapeText(40, 40, 300, 30, "在任何窗口操作鼠标都能够监听到", w.Handle)
		checkBtn := widget.NewButton(40, 80, 300, 30, "拦截鼠标右键按下消息", w.Handle).SetTypeEx(xcc.Button_Type_Check)
		checkBtn.EnableBkTransparent(true)

		// 注册事件_窗口鼠标右键按下, 用来检测是否真的拦截了鼠标右键按下消息
		w.Event_RBUTTONDOWN(func(nFlags uint, pPt *xc.POINT, pbHandled *bool) int {
			xc.XC_Alert("提示", fmt.Sprintf("响应了炫彩窗口鼠标右键被按下消息, 证明没有被拦截, nFlags: %d, pPt: %v", nFlags, pPt))
			return 0
		})

		msHook := wutil.NewHookMouse(func(nCode int32, wParam xcc.WM_, lParam *wapi.MSLLHOOKSTRUCT) uintptr {
			if nCode < 0 { // nCode小于0时不应继续处理
				return wutil.CallNextHookEx_Mouse(nCode, wParam, lParam)
			}

			switch wParam {
			case xcc.WM_LBUTTONDOWN: // 鼠标左键按下
				fmt.Println("鼠标左键按下, 坐标:", lParam.PT)
			case xcc.WM_RBUTTONDOWN: // 鼠标右键按下
				if checkBtn.GetStateEx() == xcc.Button_State_Check {
					fmt.Println("拦截了鼠标右键按下, 是不会真实响应鼠标右键消息的, 你在任务栏上右键已经没用了, 有些程序窗口拦截不了自行研究, 坐标:", lParam.PT)
					return 1 // 返回1可拦截, 这时按下鼠标右键是不会有响应的, 部分软件窗口拦截不了有多方面原因比如该程序做了特殊处理, 自行研究
				}
			case xcc.WM_MBUTTONDOWN: // 鼠标中键按下
				fmt.Println("鼠标中键按下, 坐标:", lParam.PT)
			case xcc.WM_XBUTTONDOWN: // 鼠标侧键按下
				value := wutil.GetHigh16Bits(lParam.MouseData)
				if value == 1 {
					fmt.Println("鼠标侧键1按下, 坐标:", lParam.PT)
				} else if value == 2 {
					fmt.Println("鼠标侧键2按下, 坐标:", lParam.PT)
				}
			case xcc.WM_MOUSEWHEEL: // 鼠标滚轮滚动
				value := wutil.GetHigh16Bits(lParam.MouseData)
				if lParam.MouseData > 0 {
					fmt.Printf("鼠标滚轮向上滚动, 滚轮增量: %d, 坐标:%v, lParam.MouseData: %v\n", value, lParam.PT, lParam.MouseData)
				} else if lParam.MouseData < 0 {
					fmt.Printf("鼠标滚轮向下滚动, 滚轮增量: %d, 坐标:%v, lParam.MouseData: %v\n", value, lParam.PT, lParam.MouseData)
				}
			}
			return wutil.CallNextHookEx_Mouse(nCode, wParam, lParam)
		})

		w.Event_CLOSE(func(pbHandled *bool) int {
			msHook.Unhook()
			return 0
		})
	})
}

func (*HookMouse) Unhook added in v1.3.391

func (h *HookMouse) Unhook() bool

Unhook 卸载全局鼠标钩子.

type OpenFileOption added in v1.3.393

type OpenFileOption struct {
	// 父窗口句柄, 可为0.
	HwndOwner uintptr
	// 打开的对话框标题.
	Title string
	// 初始目录, 即默认打开的目录.
	DefDir string
	// 默认文件名. 在 SaveFileEx 中有效.
	DefFileName string
	// 默认扩展名, 如果用户没有输入文件扩展名, 则默认使用这个.
	DefExt string
	// 过滤器数组, 两个成员为一个过滤器, 前面是过滤器描述, 后面是过滤器类型. 不填则不显示任何过滤器. 例: []string{"Text Files(*.txt)", "*.txt", "All Files(*.*)", "*.*"}.
	Filters []string
	// 最多打开的文件数量. 打开多个文件时可用.
	//   - 只是为了分配合适的缓冲区大小, 并不能真的限制用户选择多少个文件, 如果用户的选择超过数量, 只返回 maxOpenFiles 个.
	//   - 如果用户选择了超级多个文件, 可能会超过缓冲区大小, 一旦超过了缓冲区的大小, 会返回nil, 且 wapi.CommDlgExtendedError() == wapi.FNERR_BUFFERTOOSMALL
	MaxOpenFiles uint32

	// 标志: wapi.OFN_ , 可组合.
	//  - 打开单个文件时可不填, 默认为 wapi.OFN_PATHMUTEXIST.
	//  - 打开多个文件时, 可填 wapi.OFN_ALLOWMULTISELECT | wapi.OFN_EXPLORER | wapi.OFN_PATHMUTEXIST
	//  - 保存文件时可不填, 默认为 wapi.OFN_OVERWRITEPROMPT | wapi.OFN_PATHMUTEXIST | wapi.OFN_PATHMUTEXIST
	Flags wapi.OFN_
}

OpenFileOption 是 OpenFileEx 和 SaveFileEx 通用的参数, 都是选填, 可填可不填.

type PlayOptions added in v1.3.399

type PlayOptions struct {
	// Volume 音量 (0-1000), 不支持某些音频格式.
	Volume *int
	// Wait 是否等待播放完成.
	Wait bool
	// Repeat 是否重复播放, 不支持 wav 格式.
	Repeat bool
	// Notify 是否在播放完成时发送通知消息 wapi.MM_MCINOTIFY 到窗口消息过程.
	Notify bool
	// SeekToStart 是否从开头开始播放.
	SeekToStart bool
}

PlayOptions 播放选项.

Jump to

Keyboard shortcuts

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