c++builder - 如何使用 Windows 鼠标挂钩 API 函数在 C++ Builder 应用程序中挂钩鼠标事件?
问题描述
我在 C++Builder 中挂钩鼠标事件时遇到问题,它显示错误:
[bcc32 错误] MainUnit.cpp(24): E2034 无法将 'long * (__stdcall * (_closure )(int,unsigned int,long))(int,unsigned int,long)' 转换为 'long (__stdcall *)(int ,unsigned int,long)' 完整的解析器上下文 MainUnit.cpp(22): 解析: void TInputHookMain::SetHook()`。
和:
[bcc32 错误] MainUnit.cpp(24):E2342 参数“lpfn”中的类型不匹配(需要“long (__stdcall *)(int,unsigned int,long)”,得到“void”) 完整的解析器上下文 MainUnit.cpp(22): 解析: 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()
。
推荐阅读
- c++ - 为什么将库与 MSVC 链接可以同时使用 `/MD` 或 `/ML`?
- javascript - Javascript 从 HTML 日期字符串中获取日期
- excel - 多个工作表名称并希望找到一种动态方法来编码需要 activesheet("sheetname") 的函数
- python - 用beautifulsoup 构建一个网络爬虫
- javascript - 无法从本地 nodejs 服务器获取
- react-native - 函数组件不能给出 refs
- firebase - 图片相似度 - Firebase ML Vision 还是有其他软件包?
- delphi - TRttiProperty.SetValue 与 TMemoryStream 属性一起使用时如何避免内存泄漏?
- node.js - 从 npm 安装 Electron-Js 时出现 npm 错误
- security - 访问 `proc` 文件系统以从系统应用程序中读取 `/proc/[pid]/some-file`