传递lambda作为Windows CALLBACK函数失败

时间:2018-06-08 07:16:28

标签: c++11 winapi

static std::function<LRESULT(int nCode, WPARAM wParam, LPARAM lParam)> keyProc =
        [](int nCode, WPARAM wParam, LPARAM lParam)->LRESULT {
        return 1;
    };
    keyHook = SetWindowsHookEx(WH_KEYBOARD_LL, keyProc, theApp.m_hInstance, NULL);
  

错误C2664&#39; HHOOK SetWindowsHookExW(int,HOOKPROC,HINSTANCE,DWORD)&#39;:   无法从&#39; std :: function&#39;转换参数2至   &#39; HOOKPROC&#39; MFCTest d:\ test \ mfctest2 \ mfctest \ keymaphooker.cpp 62

PS:为什么我使用这么长的表达而不是自动?因为我想要它是静态的。

我把它改成了

auto keyProc =
        [this](int nCode, WPARAM wParam, LPARAM lParam)->LRESULT {
         return 1;//return KeyboardProc(keyHook, keyMap, nCode, wParam, lParam);
    };

它不再起作用了。

  

错误C2664:&#39; HHOOK SetWindowsHookExW(int,HOOKPROC,HINSTANCE,DWORD)&#39;:   无法转换参数2   &#39; KeyMapHooker :: StartHook ::&#39;   到&#39; HOOKPROC&#39;

1 个答案:

答案 0 :(得分:3)

无状态lambda(例如你正在使用的lambda)确实可以转换为指向函数的指针,因此可以用作CALLBACK。但是,std::function 无法以这种方式进行转换。

请注意,lambda表达式的类型不是 std::function,它是一个未命名的类类型(lambda表达式的闭包类型 )。您可以使用auto捕获正确的类型(这对存储持续时间没有影响):

static auto keyProc =
        [](int nCode, WPARAM wParam, LPARAM lParam)->LRESULT {
        return 1;
    };
    keyHook = SetWindowsHookEx(WH_KEYBOARD_LL, keyProc, theApp.m_hInstance, NULL);