Как перехватить событие мыши в приложении C ++ Builder с помощью функции Windows Mouse Hook API? - PullRequest
0 голосов
/ 02 апреля 2019

У меня проблема с перехватом события мыши в 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 , но пока безуспешно.

1 Ответ

3 голосов
/ 02 апреля 2019

MouseInputHook() должна быть глобальной функцией или методом статического класса. Итак, добавьте ключевое слово static к объявлению MouseInputHook() в заголовочном файле вашего класса.

Сообщение об ошибке означает: функция _closure не соответствует требуемому прототипу функции обратного вызова. _closure означает «указатель на нестатический метод класса» в компиляторе C ++ Builder. Нестатический метод класса имеет скрытый параметр this, что делает его несовместимым с прототипом функции, который требуется для SetWindowsHookExW().

...