c++11 - 将 lambda 作为 Windows CALLBACK 函数传递失败
问题描述
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 'HHOOK SetWindowsHookExW(int,HOOKPROC,HINSTANCE,DWORD)': 无法将参数 2 从 'std::function' 转换为 'HOOKPROC' MFCTest d:\test\mfctest2\mfctest\keymaphooker.cpp 62
PS:为什么我用这么长的表达式而不是auto?因为我希望它是静态的。
我把它改成
auto keyProc =
[this](int nCode, WPARAM wParam, LPARAM lParam)->LRESULT {
return 1;//return KeyboardProc(keyHook, keyMap, nCode, wParam, lParam);
};
它不再起作用了。
错误 C2664: 'HHOOK SetWindowsHookExW(int,HOOKPROC,HINSTANCE,DWORD)': 无法将参数 2 从 'KeyMapHooker::StartHook::' 转换为 'HOOKPROC'
解决方案
无状态 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);
推荐阅读
- r - 如何重新排序向量,使其与 R 中另一个向量的顺序相匹配?
- python - pytorch 训练函数变量和张量(阅读我的介绍,我也不知道我的问题,它只是不起作用)
- xml - 忽略空的 xml 标签
- python - TypeError:'dict'和'dict'的实例之间不支持'<':Python 3 Conversion?
- android - 如何禁用 GridView 被 PopupWindow 滚动
- php - Facade\Ignition\Exceptions\ViewException?
- javascript - 如何获取cherrypy函数的结果?
- apify - 如果运行成功,则下载最新结果
- java - ArrayList 错误:大小相同,在 remove() 之后包含“空”元素
- android - 处理 viewModel 上的内部 Transformations.switchMap