【发布时间】:2013-09-22 06:00:40
【问题描述】:
我在我的 C# 代码中使用 Windows CBT 挂钩,如下所示。这段代码效果很好,但我突然想到我对它的实际工作方式没有清楚的了解。
那么,从非托管 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());
}
}
【问题讨论】:
标签: c# .net winapi interop closures