GetMessage Win API函数引发异常(可能是由于错误的回调)

时间:2018-11-15 09:34:16

标签: c++ winapi boost

我的问题是,由于我尝试将类成员函数(不是静态的)绑定为SetWindowsHookEx函数的回调而导致的。我已经尝试调试,但是除了回调绑定之外,我无法获得任何其他有用的信息,我不知道这样做的任何其他方式。 因此,在第一次调用GetMessage函数时,我收到以下异常:An unhandled exception was encountered during a user callback.

我的问题是,如果异常的原因是我绑定HookLowLevel::KeyboardProc函数的方式,以便可以将其作为回调传递,那么正确的方法是什么?如果没有,您认为引发异常的原因是什么?

我在其中进行回调绑定的函数以及引发异常的GetMessage函数所在的位置:

void HookLowLevel::attachHook()
{
    printf("Hooking the keyboard\n");
    auto callback = std::bind(&HookLowLevel::KeyboardProc, this);
    hook_ = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)(&callback), 0, 0);
    printf("%X\n", hook_);
    MSG msg{ 0 };
    try
    {
        while (GetMessage(&msg, NULL, 0, 0) != 0 && !windowChanged_)
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    catch (const std::runtime_error& re)
    {
        std::cerr << "Runtime error: " << re.what() << std::endl;
    }
    catch (const std::exception &e)
    {
        std::cerr << "exception: " << e.what();
    }
}

这是KeyboardProc的定义:

LRESULT CALLBACK HookLowLevel::KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)

1 个答案:

答案 0 :(得分:2)

Windows API严格公开为C接口。您不能将指向非静态类成员的指针作为对 any Windows API(或std::bind返回的函数对象)的回调传递。编译器已经告诉了您有关此问题的信息,这可能导致您通过添加(无效)强制转换来使编译器静音。

删除强制类型转换,编译器将告知您是否传递了具有正确签名的函数指针。您也可以安全地删除FirstMeasurementId / try处理程序。 Windows API永远不会引发C ++异常(请参见第一段)。