C++11 作为Windows回调函数传递lambda失败

C++11 作为Windows回调函数传递lambda失败,c++11,winapi,C++11,Winapi,它不再起作用了 错误C2664:“HHOOK SetWindowsHookXW(int、HOOKPROC、HINSTANCE、DWORD)”: 无法从转换参数2 'KeyMapHooker::StartHook:' 到“HOOKPROC” 无状态lambda(例如您正在使用的lambda)确实可以转换为指向函数的指针,因此可以用作回调。但是,std::function不能以这种方式转换 请注意,lambda表达式的类型不是std::function,而是未命名的类类型(lambda表达式的闭包类

它不再起作用了

错误C2664:“HHOOK SetWindowsHookXW(int、HOOKPROC、HINSTANCE、DWORD)”: 无法从转换参数2 'KeyMapHooker::StartHook:' 到“HOOKPROC”

无状态lambda(例如您正在使用的lambda)确实可以转换为指向函数的指针,因此可以用作
回调
。但是,
std::function
不能以这种方式转换

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


不清楚,你为什么要用lambda?你想完成什么?为什么不能只使用常规功能?哦,新版本的VS可以支持静态自动。我以前在vs2010上尝试过这个,但没有。现在我使用VS2017。我再也没有尝试过静态自动。现在,我知道,我可以使用静态自动。你也可以做
SetWindowsHookEx(WH_KEYBOARD,LL,[](int-nCode,WPARAM-WPARAM,LPARAM-LPARAM)->LRESULT{…},…)@JonathanPotter那么lambda当然不会是静态的。等等!!!!我刚试过你的代码可以工作。但是,当我添加一个捕获时:[这个](/*其他人不会改变*/)。。。它不再起作用了@马化腾 当然正如我所说(正如标准所说),只有无状态lambda(即不捕获任何内容的lambda)可以转换为函数指针。
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);
auto keyProc =
        [this](int nCode, WPARAM wParam, LPARAM lParam)->LRESULT {
         return 1;//return KeyboardProc(keyHook, keyMap, nCode, wParam, lParam);
    };
static auto keyProc =
        [](int nCode, WPARAM wParam, LPARAM lParam)->LRESULT {
        return 1;
    };
    keyHook = SetWindowsHookEx(WH_KEYBOARD_LL, keyProc, theApp.m_hInstance, NULL);