【问题标题】:How to Hook Mouse Event in C++ Builder Application using Windows Mouse Hook API Function?如何使用 Windows 鼠标挂钩 API 函数在 C++ Builder 应用程序中挂钩鼠标事件?
【发布时间】:2019-04-03 05:46:12
【问题描述】:

我在 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++ Tutorial,但到目前为止没有运气。

【问题讨论】:

  • 非常感谢,老实说我从不经常使用static关键字,但这解决了问题。

标签: c++builder mouse-hook


【解决方案1】:

MouseInputHook() 应该是一个全局函数,或者是一个静态类方法。所以,在你的类头文件MouseInputHook()的声明中添加static关键字。

错误消息的意思是:_closure 函数与所需的回调函数原型不匹配。 _closure 在 C++Builder 编译器中表示“指向非静态类方法的指针”。非静态类方法有一个隐藏的this 参数,这使得它与SetWindowsHookExW() 所需的函数原型不兼容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    相关资源
    最近更新 更多