Как обнаружить двойной щелчок / нажатие при обработке сообщения WM_POINTER? - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь реализовать Pointer Input Messages для замены обычного сообщения мыши в окне. Я делаю это для лучшей поддержки ввода стилуса в моей программе. Все отлично работает, кроме двойного щелчка.

Я не обрабатывал сообщение указателя раньше, поэтому эти сообщения указателя, отправленные драйвером стилуса, были просто переданы DefWindowProc, а DefWindowProc просто сгенерировал ввод мыши, как WM_LBUTTONDBLCLK.

В отличие от сообщения мыши WM_LBUTTONDBLCLK, нет указателя, который бы явно указывал, что это двойной щелчок. Я понимаю их намерение разработать краткую группу сообщений и сделать все остальное в единой чистой структуре. POINTER_PEN_INFO - это та структура, которая содержит всю информацию, связанную с текущим сообщением. Я думал, что смогу найти что-нибудь там, возможно, некоторые флаги, чтобы указать, что сообщение WM_POINTERDOWN следует рассматривать как двойной щелчок, но там тоже ничего нет.

Я что-то пропустил? Если нет, что еще я могу сделать, чтобы обнаружить двойной щелчок? Я мог найти только некоторые устаревшие документы, которые были написаны для Windows XP на MSDN. Я программирую на Windows 10, Win32 API программирую на C ++.

Спасибо!

1 Ответ

0 голосов
/ 27 апреля 2018

Вы можете сделать это, отслеживая клики и сравнивая каждый клик с последним так же, как это делает Windows.

псевдопользователей-код:

POINT ptLastClickPos;
DWORD dwLastClickTime;

if (uMsg == WM_POINTERDOWN)
{
    DWORD dwClickTime = GetMessageTime();
    POINT ptClickPos = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) };

    if (dwLastClickTime + GetDoubleClickTime() > dwClickTime
    &&  abs(ptLastClickPos.x - ptClickPos.x) < GetSystemMetrics(SM_CXDOUBLECLICK)
    &&  abs(ptLastClickPos.y - ptClickPos.y) < GetSystemMetrics(SM_CYDOUBLECLICK))
    {
        // double-click!
    }
    else
    {
        dwLastClickTime = dwClickTime;
        ptLastClickPos = ptClickPos;
    }
}
...