1
我在我的C#代碼中使用Windows CBT掛鉤,如下所示。這段代碼工作的很好,但是我想到我並不清楚它是如何工作的。如何從本地代碼實現.NET方法回調?
那麼,如何從非託管Windows代碼回調到正規的函數指針(CBTProc)變成非靜態成員管理的方法調用,所以我可以在我的CbtHookProc
訪問this
?
通常,我理解C#委託人如何捕獲託管代碼中的作用域。我的問題是關於它如何仍然適用於非託管回調。在本地C++中,如果不使用全局變量或ATL thunk等一些技巧,這是不可能的。
class CbtHook
{
delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam);
HookProc cbtHookProc;
IntPtr cbtHookId;
const int WH_CBT = 5;
[DllImport("user32.dll")]
static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, uint threadId);
[DllImport("kernel32.dll")]
static extern uint GetCurrentThreadId();
[DllImport("user32.dll")]
static extern IntPtr CallNextHookEx(IntPtr hhook, int nCode, IntPtr wParam, IntPtr lParam);
IntPtr CbtHookProc(int nCode, IntPtr wParam, IntPtr lParam)
{
// can access 'this' here
return CallNextHookEx(this.cbtHookId, nCode, wParam, lParam);
}
public CbtHook()
{
this.cbtHookProc = new HookProc(CbtHookProc);
this.cbtHookId = SetWindowsHookEx(WH_CBT, this.cbtHookProc, IntPtr.Zero, GetCurrentThreadId());
}
}