使用Golang实现Windows Hooks

3
我正在编写一个应用程序,将利用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技巧。

1个回答

4

请阅读关于cgo的维基页面。

您需要在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

1
我几个月前正在研究这个,如果不是新的话可能我错过了,非常感谢! - Hut8
它已经是Go的一部分了,可能自1.0或1.1版本开始。 - OneOfOne

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接