我认为这是由于我试图将类成员函数(非静态(绑定为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++异常(请参见第一段(。