2014-06-09 25 views
3

我正在編寫一個應用程序,它將使用Win32 API WH_KEYBOARD掛鉤,以便它可以在沒有焦點的情況下被激活(即在前臺顯示)。該回調自然是一個函數指針(類型HOOKPROC)。 WH_KEYBOARD和WH_KEYBOARD_LL的很多文檔都說回調函數必須駐留在一個DLL中,並且不能直接在EXE中,但是我發現在Windows XP和更高版本中不是這樣,所以我認爲這是一個歷史的怪癖。窗鉤與golang

該應用程序是用Go編寫的。我知道(並有貢獻)github.com/AllenDang/w32,但我沒有看到任何可以用來處理函數指針的東西。由於goroutines的結構,這甚至有可能嗎?我知道從Go調用C很簡單,但是對於像這樣的回調函數指針怎麼辦呢?

現在我組裝機是編寫通過標準輸出發送消息的EXE,分別對其進行編譯,它使用go-bindata並在運行時寫入這一個臨時文件並執行它,而一個的goroutine手錶包括進程的標準輸出。這讓我感到害怕。請告訴我,沒有使用外部進程和可怕的IPC hackery有更好的方法。

回答

4

閱讀關於cgo的維基網頁。

你將不得不在C中定義的回調,然後調用從它的運轉功能:

首先導出轉到回調:

//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

+0

這是Go的一部分,可能從1.0或1.1開始 – OneOfOne