Documentation
¶
Overview ¶
Package wutil 调用 wapi 封装了部分常用功能.
Index ¶
- Constants
- func CallNextHookEx_Keyboard(nCode int32, wParam xcc.WM_, lParam *wapi.KBDLLHOOKSTRUCT) uintptr
- func CallNextHookEx_Mouse(nCode int32, wParam xcc.WM_, lParam *wapi.MSLLHOOKSTRUCT) uintptr
- func ChooseColor(hParent int) uint32
- func GetClipboardText() (string, error)
- func GetDropFiles(hDropInfo uintptr) []string
- func GetHigh16Bits(value int32) int16
- func GetLow16Bits(value int32) int16
- func GetScreenHeight() int32
- func GetScreenWidth() int32
- func GetWindows(pid ...int) []uintptr
- func HIcon(iconPath string) uintptr
- func IsComboKey(mainKey int32, modifierKeys ...int32) bool
- func IsKeyPressed(vkCode int32) bool
- func OpenDir(hParent int) string
- func OpenFile(hParent int, filters []string, defaultDir string) string
- func OpenFileEx(opt OpenFileOption) []string
- func OpenFiles(hParent int, filters []string, defaultDir string) []string
- func SaveFile(hParent int, filters []string, defaultDir, defaultFileName string) string
- func SaveFileEx(opt OpenFileOption) string
- func SetClipboardText(text string) error
- type AudioPlayer
- func (ap *AudioPlayer) CanPlay() bool
- func (ap *AudioPlayer) Close() error
- func (ap *AudioPlayer) GetLength() (int, error)
- func (ap *AudioPlayer) GetPlaybackMode() (string, error)
- func (ap *AudioPlayer) GetPosition() (int, error)
- func (ap *AudioPlayer) GetVolume() (int, error)
- func (ap *AudioPlayer) IsPaused() bool
- func (ap *AudioPlayer) IsPlaying() bool
- func (ap *AudioPlayer) IsStopped() bool
- func (ap *AudioPlayer) Open(fileName string) error
- func (ap *AudioPlayer) Pause() error
- func (ap *AudioPlayer) Play(opts ...PlayOptions) error
- func (ap *AudioPlayer) Resume() error
- func (ap *AudioPlayer) Seek(positionMs int) error
- func (ap *AudioPlayer) SeekPercent(percent float64) error
- func (ap *AudioPlayer) SeekRelative(offsetMs int) error
- func (ap *AudioPlayer) SeekToEnd() error
- func (ap *AudioPlayer) SeekToStart() error
- func (ap *AudioPlayer) SetVolume(volume int) error
- func (ap *AudioPlayer) Stop() error
- type HookKeyboard
- type HookMouse
- type OpenFileOption
- type PlayOptions
Examples ¶
Constants ¶
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
CallNextHookEx_Keyboard 用于 NewHookKeyboard 的参数 KeyboardProc 回调函数的返回值.
- 在回调函数中放行键盘消息应该 return wutil.CallNextHookEx_Keyboard(nCode, wParam, lParam). 拦截键盘消息应该 return 1.
func CallNextHookEx_Mouse ¶ added in v1.3.391
CallNextHookEx_Mouse 用于 NewHookMouse 的参数 MouseProc 回调函数的返回值.
- 在回调函数中放行鼠标消息应该 return wutil.CallNextHookEx_Mouse(nCode, wParam, lParam). 拦截鼠标消息应该 return 1.
func GetHigh16Bits ¶ added in v1.3.391
GetHigh16Bits 获取 int32 的高16位.
func GetLow16Bits ¶ added in v1.3.391
GetLow16Bits 获取 int32 的低16位.
func GetWindows ¶ added in v1.3.394
GetWindows 枚举指定进程的所有窗口句柄.
pid: 进程ID, 如果填-1, 则使用当前进程id. 如果填0, 则枚举所有进程的窗口句柄.
func HIcon ¶ added in v1.3.392
HIcon 从文件加载图标. 返回 HICON 句柄.
- 可用于需要 HICON 句柄的函数, 如设置托盘图标.
- 如果失败, 可使用 syscall.GetLastError() 获取错误信息.
- 当图标句柄不再使用时, 可使用 wapi.DestroyIcon 函数释放.
iconPath: 图标路径.
func IsComboKey ¶ added in v1.3.395
IsComboKey 判断组合键是否按下.
func IsKeyPressed ¶ added in v1.3.395
IsKeyPressed 使用 wapi.GetAsyncKeyState 判断按键是否按下.
vkCode: 按键的虚拟键码. xcc.VK_ .
func OpenFile ¶
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 ¶
OpenFiles 打开多个文件. 返回文件完整路径数组. 注意:
- 如果用户选择了超级多个文件, 可能会超过缓冲区大小, 一旦超过了缓冲区的大小, 会返回nil, 且 wapi.CommDlgExtendedError() == wapi.FNERR_BUFFERTOOSMALL
hParent: 父炫彩窗口句柄, 可为0.
filters: 过滤器数组, 两个成员为一个过滤器, 前面是过滤器描述, 后面是过滤器类型. 填nil则不显示任何过滤器. 例: []string{"Text Files(*.txt)", "*.txt", "All Files(*.*)", "*.*"}.
defaultDir: 初始目录, 即默认打开的目录.
func SaveFile ¶
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 保存文件. 返回文件完整路径.
Types ¶
type AudioPlayer ¶ added in v1.3.399
type AudioPlayer struct {
// Alias 音频别名.
// - 这是在 Open() 时内部指定的.
// - 可用于自行调用 MCI 命令.
Alias string
}
AudioPlayer 音频播放器.
- 注意: 尽量在调用 Open() 的线程调用其它方法.
- 尽可能统一在 UI 线程调用, 否则可能调用失败.
func (*AudioPlayer) CanPlay ¶ added in v1.3.399
func (ap *AudioPlayer) CanPlay() bool
CanPlay 是否可以开始播放.
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) 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.
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
})
})
}
Output:
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
})
})
}
Output:
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 播放选项.