在WINAPI回调中访问此对象

时间:2016-12-10 16:32:33

标签: c++ winapi lambda callback

我想在辅助线程中设置一个钩子,线程对象是一个对象成员,所以我决定传递一个lambda,它通过引用捕获this,因为对复制构造函数的调用会创建另一个线程导致无限递归。

MyClass() : thread_([this](){
    HHOOK kbdHook_LL = SetWindowsHookEx(WH_KEYBOARD_LL, some_func_ptr, 0, 0);
    MSG msg;
    while(!GetMessage(&msg, NULL, NULL, NULL)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    UnhookWindowsHookEx(kbdHook_LL);
    return 0;
}) {}

我的问题是我需要some_func_ptr来了解this - 对象,因为它还存储处理事件所需的信息。但是我不能使用嵌套的lambda来捕获它,因为只有无捕获的lambdas可以用作函数指针。

some_func_ptr应如下所示

LRESULT CALLBACK some_func_ptr(int nCode, WPARAM wParam, LPARAM lParam) {
    if(nCode == HC_ACTION) {
        PKBDLLHOOKSTRUCT pData = (PKBDLLHOOKSTRUCT)lParam;
        switch(wParam) {
            case WM_KEYDOWN:
                //use `this` in some way
                break;
            case WM_SYSKEYDOWN:
                //etc.
                break;
        }
    }
    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

我对C ++没有经验,特别是在基于C的内核API方面没有经验,因此我不知道如何解决这个问题。

0 个答案:

没有答案