github.com/go-vgo/robotgo 引入后执行报错undefined: hook.Event

一直想自己开发一个改键程序,打魔兽争霸单机的时候能使用,最近突然想试试用GO语言来实现,万能的互联网一搜,果然有,import  “github.com/go-vgo/robotgo”就可以了,带着兴奋的心情开始尝试。

go是1.20版本,

按教程
go  get  github.com/go-vgo/robotgo
直接错!因为 github.com 在国内不好使。

继续请教万能互联网

go env -w GO111MODULE=on
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/

再执行 go  get  github.com/go-vgo/robotgo ,舒服了。。。

然后测试输出版本

package main

import (
   "github.com/go-vgo/robotgo"
)

func main() {
   robotgo.keyTap(`control`, `esc`)
}

继续报错!错误信息如下:

# github.com/go-vgo/robotgo
 ..\pkg\mod\github.com\go-vgo\robotgo@v0.100.10\hook.go:30:29: undefined: hook.Event
 ..\pkg\mod\github.com\go-vgo\robotgo@v0.100.10\hook.go:31:14: undefined: hook.Start
 ..\pkg\mod\github.com\go-vgo\robotgo@v0.100.10\hook.go:36:7: undefined: hook.End
 ..\pkg\mod\github.com\go-vgo\robotgo@v0.100.10\hook.go:43:24: undefined: hook.Event
 ..\pkg\mod\github.com\go-vgo\robotgo@v0.100.10\hook.go:44:14: undefined: hook.Start
 ..\pkg\mod\github.com\go-vgo\robotgo@v0.100.10\hook.go:60:36: undefined: hook.Event
 ..\pkg\mod\github.com\go-vgo\robotgo@v0.100.10\hook.go:65:69: undefined: hook.Event
 ..\pkg\mod\github.com\go-vgo\robotgo@v0.100.10\img.go:92:40: undefined: Bitmap
 ..\pkg\mod\github.com\go-vgo\robotgo@v0.100.10\img.go:107:38: undefined: Bitmap
 ..\pkg\mod\github.com\go-vgo\robotgo@v0.100.10\img.go:137:20: undefined: Bitmap
 ..\pkg\mod\github.com\go-vgo\robotgo@v0.100.10\hook.go:44:14: too many errors

继续请教万能的互联网!
请教。。。。
请教。。。
请教。。
请教。
额。
不万能了,网上没有一篇文章是介绍出现这个问题的解决办法的!

所以我也不知道怎么解决!

暂时认为是没有GCC的问题,下载了 MinGW-w64 还是不行,那么不是官方包有问题(可能性不大),就是本地系统有问题。

系统问题猜想,当前用户没有权限执行hook?用管理员终端 [ 右击开始->终端(管理员) ] 重走一遍流程,发现成了报 robotgo.keyTap undefined 了。。。

再看源码,keyTap的首字母K得是大写,改一下,再执行,没报错了(会不会不是是权限问题,一直就是大小写问题啊0.0!)。但是按键命令没效果。。。

至此 hook.Event undefined 问题没有了,至于按键没效果,还得继续查是什么原因。。。

经过测试发现按键顺序不能乱放,正常顺序是 robotgo.KeyTap(`esc`,`control`),改完顺序,终于打开  开始菜单 面板了。。。

接下来是监听键盘,修改输出

fmt.Println("开启改键")

// 注册监听键盘按下事件,当按下q的时候,程序按一下小键盘7,按下d的时候,程序按一下小键盘8
robotgo.EventHook(hook.KeyDown, []string{}, func(e hook.Event) {
   if e.Keychar == 'q' {
       robotgo.KeyTap("num7")
   }
   if e.Keychar == 'd' {
       robotgo.KeyTap("num8")
   }
})
//开始监听
s := robotgo.EventStart()
// 忽略来自进程的值,防止报错
<- robotgo.EventProcess(s)

本来想实现改键的,发现robotgo只能监听消息,不能修改消息(理想情况是按下q实际系统收到的是num7,现在的情况是按下q的时候,系统 和 robotgo 都知道按下q了,然后robotgo又按了下num7),所以只能做成这种效果了,运行游戏试了下,能满足需求!!!

想要完美实现功能,还得研究windows系统接口,先到这里就打住吧。。。

一点小调整

fmt.Println("开启改键") 

// 注册监听键盘按下事件,当按下q的时候,程序按一下小键盘7,按下d的时候,程序按一下小键盘8
robotgo.EventHook(hook.KeyDown, []string{}, func(e hook.Event) {
    // 获取当前活跃窗口名称
    title := robotgo.GetTitle()
    // 如果是 War3 程序,则帮忙按键
    if(title == "Warcraft III"){
        if e.Keychar == 'q' {
            robotgo.KeyTap("num7")
        }
        if e.Keychar == 'd' {
            robotgo.KeyTap("num8")
        }
    }
})
s := robotgo.EventStart()
<- robotgo.EventProcess(s)

 

作者: 二皮

Hackers please go away