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

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

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

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

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

Спасибо!

1 ответ

Решение

Вы можете сделать это, отслеживая клики и сравнивая каждый клик с последним так же, как это делает 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;
    }
}
Другие вопросы по тегам