wutil

package
v1.3.394 Latest Latest
Warning

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

Go to latest
Published: Feb 5, 2025 License: MIT Imports: 11 Imported by: 12

Documentation

Overview

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

Index

Examples

Constants

This section is empty.

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) int

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 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 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 通用的参数, 都是选填, 可填可不填.

Jump to

Keyboard shortcuts

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