Блокировка сообщений мыши с помощью крючка

#c #winapi

Вопрос:

Как мне «заблокировать» WM_LBUTTONDOWN сообщение, которое должно быть отправлено?

Функция находится внутри библиотеки dll, я также пытался использовать LowLevelMouseProc ее, но она не работает с кодом ошибки: 1429 что означает «глобальный только крюк».

  • Я не владею этим окном, о котором идет речь.

Я попытался вернуть a WM_NULL в приведенном ниже коде, но это также не работает, что еще я мог бы попробовать?

 extern "C" __declspec(dllexport) LRESULT CALLBACK mouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
        MSLLHOOKSTRUCT* mhs          = nullptr;
        int x = 0;
        int y = 0;
    
        std::wstringstream ss;
        std::wstringstream ss2;
    
        if (nCode == HC_ACTION)
        {
            switch (wParam)
            {
            case WM_LBUTTONDOWN:
                ss << L"nWM_LBUTTONDOWN " << wParam;
                wParam = WM_NULL;
                break;
            case WM_LBUTTONUP:
                ss << L"nWM_LBUTTONUP " << wParam;
                break;
            case WM_MOUSEMOVE:
                break;
            case WM_RBUTTONDOWN:
                ss << L"nWM_RBUTTONDOWN: " << wParam;
                break;
            case WM_RBUTTONUP:
                ss << L"nWM_RBUTTONUP: " << wParam;
                break;
            default:
                ss << L"nUnknown msg: " << wParam;
                break;
            }
        }
    
        OutputDebugString(ss.str().c_str());
    
        mhs = reinterpret_cast<MSLLHOOKSTRUCT*>(lParam);
        x = mhs->pt.x;
        y = mhs->pt.y;
    
        ss2 <<  L"nx: " << x << L" y: " << y;
        OutputDebugString(ss2.str().c_str());
    
        return CallNextHookEx(NULL, nCode, wParam, lParam);
 

Ответ №1:

Согласно документации по MouseProc функции обратного вызова:

Если nCode больше или равен нулю, а процедура подключения не обработала сообщение, настоятельно рекомендуется вызвать CallNextHookEx и вернуть возвращаемое значение; в противном случае другие приложения, установившие крючки WH_MOUSE, не будут получать уведомления о подключении и в результате могут вести себя неправильно. Если процедура hook обработала сообщение, она может вернуть ненулевое значение, чтобы система не передала сообщение процедуре целевого окна.

Что касается вашей WH_MOUSE_LL ошибки, вы не можете установить этот крючок для конкретного потока, только в глобальном масштабе.