我正在编写一个应用程序,它将使用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,有更好的方法。
答案 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#L129,https://github.com/OneOfOne/go-nfqueue/blob/master/nfqueue.h和https://github.com/OneOfOne/go-nfqueue/blob/master/nfqueue.c#L49