我在C++Builder中钩住鼠标事件时遇到问题,它显示错误:
[密件抄送32错误]主机.cpp(24(: E2034 无法将"long * (__stdcall * (_closure ((int,unsigned int,long(((int,unsigned int,long("转换为"long (__stdcall *((int,unsigned int,long(" 完整解析器上下文 MainUnit.cpp(22(: parsesing: void TInputHookMain::SetHook(('.
和:
[密件抄送32错误]主机.cpp(24(: E2342 参数"lpfn"中的类型不匹配(需要"long (__stdcall *((int,unsigned int,long(",得到"void"( 完整解析器上下文 MainUnit.cpp(22(: parsesing: void TInputHookMain::SetHook(('.
这是我在主单元中的代码:
HHOOK mouseHook;
void TInputHookMain::ReleaseHook()
{
UnhookWindowsHookEx(mouseHook);
}
void TInputHookMain::SetHook()
{
if ( !(mouseHook = SetWindowsHookExW(WH_MOUSE_LL, MouseInputHook, NULL, 0)) )
{
ShowMessage("Failed To Install Mouse Hook!");
}
}
LRESULT __stdcall TInputHookMain::MouseInputHook(int nCode, WPARAM MsgID, LPARAM Data)
{
if ( nCode >= 0 )
{
switch ( MsgID ) {
case WM_LBUTTONDOWN: ShowMessage("Left Mouse Button Clicked!");
break;
case WM_RBUTTONDOWN: ShowMessage("Right Mouse Button Clicked!");
break;
}
}
return CallNextHookEx(mouseHook, nCode, MsgID, Data);
}
可悲的是,我找不到问题出在哪里。我试图一步一步地遵循C++教程,但到目前为止没有运气。
MouseInputHook()
应该是一个全局函数,或者是一个静态类方法。因此,将 static
关键字添加到类头文件中的 MouseInputHook()
声明中。
错误消息表示:_closure
函数与所需的回调函数原型不匹配。 _closure
表示 C++Builder 编译器中的"指向非静态类方法的指针"。非静态类方法具有隐藏的this
参数,这使得它与SetWindowsHookExW()
所需的函数原型不兼容。