Не могу найти никакой документации по WM_MOUSEFIRST - PullRequest
0 голосов
/ 08 мая 2020

У меня есть собственный WndPro c, который должен обрабатывать ввод в зависимости от того, открыто ли мое меню Im Gui.

if (Menu::isOpen) {
    ImGui_ImplWin32_WndProcHandler(hWnd, msg, wParam, lParam);
    if    (msg == WM_LBUTTONDOWN
        || msg == WM_LBUTTONUP
        || msg == WM_LBUTTONDBLCLK

        || msg == WM_MBUTTONDOWN
        || msg == WM_MBUTTONUP
        || msg == WM_MBUTTONDBLCLK

        || msg == WM_RBUTTONDOWN
        || msg == WM_RBUTTONUP
        || msg == WM_RBUTTONDBLCLK

        || msg == WM_XBUTTONDOWN
        || msg == WM_XBUTTONUP
        || msg == WM_XBUTTONDBLCLK
        || msg == WM_MOUSEFIRST) return 0;
}
return CallWindowProc((WNDPROC)Get().m_ulOldWndProc, hWnd, msg, wParam, lParam);

Моя цель - предотвратить ТОЛЬКО щелчки мыши, фон, если мой Im Gui открыт. Я заметил, что если я не препятствую прохождению WM_MOUSEFIRST, некоторые щелчки все еще иногда регистрируются в приложении. Я также заметил, что когда я предотвращаю прохождение WM_MOUSEFIRST, наведение курсора на что-то в приложении не работает, что я бы хотел. Я подумал, что могу решить проблему, проверив что-то в wParams или lParams, но я не могу найти никакой документации по ним для WM_MOUSEFIRST

Ответы [ 2 ]

6 голосов
/ 08 мая 2020

WM_MOUSEFIRST и WM_MOUSELAST не являются идентификаторами сообщений. Это символьные c константы, используемые для express ряда сообщений, связанных с мышью. Они полезны только для определения того, попадает ли какое-либо сообщение в этот конкретный диапазон, например,

bool is_mouse_msg(uint32_t msg)
{
    return (msg >= WM_MOUSEFIRST) && (msg <= WM_MOUSELAST);
}

Вы найдете похожие пары WM_XXXFIRST / WM_XXXLAST для многих других типов сообщений, например WM_KEYFIRST / WM_KEYLAST, WM_TABLET_FIRST / WM_TABLET_LAST, et c.

0 голосов
/ 08 мая 2020

После того, как я разбил мышь, я обнаружил, что щелчок регистрируется только в том случае, если мышь движется. Это произошло из-за того, что приложение проверило, установлен ли для WM_MOUSEMOVE (который аналогичен WM_MOUSEFIRST) wParam MK_LBUTTON. Я просто добавил. || ((msg == WM_MOUSEMOVE) && (wParam != 0))

...