Documentation
¶
Overview ¶
Package wutil 调用 wapi 封装了部分常用功能.
Index ¶
- 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) int
- 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 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 HookKeyboard
- type HookMouse
- type OpenFileOption
Examples ¶
Constants ¶
This section is empty.
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 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 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 通用的参数, 都是选填, 可填可不填.