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;
答案 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);