2013-09-22 35 views
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()); 
    } 
} 

回答

2

MSDN

當代表們封的函數指針,運行時分配一個thunk,做從非託管過渡到管理。這個thunk是託管代表最終被調用之前非託管代碼實際調用的內容。