Windows与Golang挂钩

时间:2014-06-09 21:44:06

标签: c windows winapi go keyboard-hook

我正在编写一个应用程序,它将使用Win32 API WH_KEYBOARD挂钩,以便可以激活(即显示在前台)而无需关注。回调当然是一个函数指针(HOOKPROC类型)。 WH_KEYBOARD和WH_KEYBOARD_LL的许多文档都说回调必须驻留在DLL中,并且不能直接在EXE中,但是我发现在Windows XP及更高版本中不是这样,所以我认为这是一个历史怪癖。

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

现在我的kludge是编写一个EXE,通过标准输出发送消息,单独编译,使用go-bindata包含它,并在运行时将其写入临时文件并执行它,同时goroutine手表该过程的标准输出。这让我很畏缩。请告诉我,如果不使用外部流程和糟糕的IPC hackery,有更好的方法。

1 个答案:

答案 0 :(得分: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