【问题标题】:Windows Hooks with golang带有 golang 的 Windows 钩子
【发布时间】:2014-06-09 21:44:05
【问题描述】:

我正在编写一个使用 Win32 API WH_KEYBOARD 钩子的应用程序,这样它就可以在没有焦点的情况下被激活(即显示在前台)。回调自然是一个函数指针(HOOKPROC 类型)。 WH_KEYBOARD 和 WH_KEYBOARD_LL 的许多文档都说回调必须驻留在 DLL 中并且不能直接在 EXE 中,但是我发现在 Windows XP 及更高版本中并非如此,所以我认为这是一个历史怪癖。

应用程序是用 Go 编写的。我知道(并为)github.com/AllenDang/w32 做出了贡献,但我没有看到任何可用于处理函数指针的东西。由于 goroutines 的结构,这甚至可能吗?我知道从 Go 调用 C 很简单,但是对于像这样的回调函数指针有什么作用呢?

现在我的任务是编写一个通过标准输出发送消息的 EXE,单独编译它,使用 go-bindata 包含它,并在运行时将它写入一个临时文件并执行它,而一个 goroutine 监视该进程的标准输出。它让我畏缩。请告诉我有一种更好的方法,无需使用外部进程和糟糕的 IPC 黑客。

【问题讨论】:

    标签: c windows winapi go keyboard-hook


    【解决方案1】:

    阅读关于 cgo 的 wiki 页面。

    您必须在 C 中定义回调,然后从中调用您的 Go 函数:

    首先导出你的 Go 回调:

    //export gocb
    func gocb() {
    
    }
    

    然后在hook.c 中定义你的回调

    #include "_cgo_export.h"
    
    void c_callback() {
        gocb();
    }
    

    这是我的代码,我破解了它来测试一些东西,之后再也没有时间清理它。

    这是一个(丑陋的)示例:https://github.com/OneOfOne/go-nfqueue/blob/master/nfqueue.go#L129https://github.com/OneOfOne/go-nfqueue/blob/master/nfqueue.hhttps://github.com/OneOfOne/go-nfqueue/blob/master/nfqueue.c#L49

    【讨论】:

    • 几个月前我正在研究这个,如果它不是新的,一定错过了。非常感谢!
    • 它已经成为 Go 的一部分有一段时间了,可能从 1.0 或 1.1 开始
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2021-03-19
    • 2019-10-22
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多