如何使用 Windows Mouse Hook API 函数在 C++ Builder 应用程序中挂接鼠标事件?
How to Hook Mouse Event in C++ Builder Application using Windows Mouse Hook API Function?
我在 C++Builder 中挂钩鼠标事件时遇到问题,它显示错误:
[bcc32 Error] MainUnit.cpp(24): E2034 Cannot convert 'long * (__stdcall * (_closure )(int,unsigned int,long))(int,unsigned int,long)' to 'long (__stdcall *)(int,unsigned int,long)'
Full parser context
MainUnit.cpp(22): parsing: void TInputHookMain::SetHook()`.
并且:
[bcc32 Error] MainUnit.cpp(24): E2342 Type mismatch in parameter 'lpfn' (wanted 'long (__stdcall *)(int,unsigned int,long)', got 'void')
Full parser context
MainUnit.cpp(22): parsing: 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++ Tutorial 一步步进行,但到目前为止运气不佳。
MouseInputHook()
应该是一个全局函数,或者静态的class方法。因此,将 static
关键字添加到 class 头文件中 MouseInputHook()
的声明中。
错误消息的意思是:_closure
函数与所需的回调函数原型不匹配。 _closure
在 C++Builder 编译器中表示 "a pointer to a non-static class method"。非静态 class 方法有一个隐藏的 this
参数,这使得它与 SetWindowsHookExW()
要求的函数原型不兼容。
我在 C++Builder 中挂钩鼠标事件时遇到问题,它显示错误:
[bcc32 Error] MainUnit.cpp(24): E2034 Cannot convert 'long * (__stdcall * (_closure )(int,unsigned int,long))(int,unsigned int,long)' to 'long (__stdcall *)(int,unsigned int,long)' Full parser context MainUnit.cpp(22): parsing: void TInputHookMain::SetHook()`.
并且:
[bcc32 Error] MainUnit.cpp(24): E2342 Type mismatch in parameter 'lpfn' (wanted 'long (__stdcall *)(int,unsigned int,long)', got 'void') Full parser context MainUnit.cpp(22): parsing: 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++ Tutorial 一步步进行,但到目前为止运气不佳。
MouseInputHook()
应该是一个全局函数,或者静态的class方法。因此,将 static
关键字添加到 class 头文件中 MouseInputHook()
的声明中。
错误消息的意思是:_closure
函数与所需的回调函数原型不匹配。 _closure
在 C++Builder 编译器中表示 "a pointer to a non-static class method"。非静态 class 方法有一个隐藏的 this
参数,这使得它与 SetWindowsHookExW()
要求的函数原型不兼容。