我的问题是,由于我尝试将类成员函数(不是静态的)绑定为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)
答案 0 :(得分:2)
Windows API严格公开为C接口。您不能将指向非静态类成员的指针作为对 any Windows API(或std::bind返回的函数对象)的回调传递。编译器已经告诉了您有关此问题的信息,这可能导致您通过添加(无效)强制转换来使编译器静音。
删除强制类型转换,编译器将告知您是否传递了具有正确签名的函数指针。您也可以安全地删除FirstMeasurementId
/ try
处理程序。 Windows API永远不会引发C ++异常(请参见第一段)。