GetMessage Win API函数抛出异常(可能是由于回调错误)



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

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

我在其中执行回调绑定的函数,以及抛出异常的GetMessage函数所在的位置:

void HookLowLevel::attachHook()
{
    printf("Hooking the keyboardn");
    auto callback = std::bind(&HookLowLevel::KeyboardProc, this);
    hook_ = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)(&callback), 0, 0);
    printf("%Xn", 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)

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

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

最新更新