关于c builder:如何使用Windows Mouse Hook API函数在C Builder应用程序中钩住鼠标事件?

How to Hook Mouse Event in C++ Builder Application using Windows Mouse Hook API Function?

我在C Builder中钩住鼠标事件时遇到问题,它显示错误:

1
2
3
[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()`.

并且:

1
2
3
[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()`.

这是我主要单元中的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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()所需的函数原型不兼容。