Комбинация мыши и клавиатуры Win32 - PullRequest
4 голосов
/ 09 февраля 2012

Мне нужно объединить события мыши и клавиатуры в Win32, например Click + Shift или Click + Alt + Shift .

Например (псевдокод):

case WM_LBUTTONDOWN:

       if (Shift)
            //click+Shift
       if (Shift && Ctrl)
            //click+Shift+Ctrl
       if (Shift && Alt)
            //click+Shift+Alt
break;

Я знаю все необходимые параметры из здесь и здесь .

Но я не знаю, как правильно их комбинировать.

Ответы [ 4 ]

2 голосов
/ 09 февраля 2012

Предполагая, что это внутри вашего winproc:

if(wParam & MK_SHIFT)
{
   if (wParam & MK_CONTROL && wParam & MK_SHIFT)
   {
     //click+Shift+Ctrl
   }
   else if(wParam & MK_SHIFT && HIBYTE(GetKeyState(VK_MENU)) & 0x80)
   {
        //alt+shift
   }
   else
   {
      //just shift
   }
}

Shift, click и alt немного сложнее, вы должны использовать другой способ

Почему так?На странице WM_LBUTTONDOWN вы увидите, что для каждого отправленного сигнала у вас есть заданные параметры.Одним из них является wparam.Он может иметь разные значения в зависимости от того, нажата ли какая-то специальная клавиша или нет

И поскольку wparam сигнала WM_LBUTTONDOWN не содержит информацию о кнопке alt, вам придется использовать GetKeyState функция, которая возвращает старшее значение бита 1, если клавиша нажата, и что-либо еще, если это не так.

1 голос
/ 09 февраля 2012

Используйте функцию GetKeyState , чтобы получить состояние клавиш-модификаторов во время создания текущего сообщения.Итак:

if (GetKeyState(VK_SHIFT) < 0 && GetKeyState(VK_CONTROL) < 0) {
    // click+shift+ctrl
} else if (GetKeyState(VK_SHIFT) < 0) {
    // click+shift
}

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

0 голосов
/ 01 июня 2012

В моем текущем проекте мы устанавливаем флаги в разделе WM_KEYDOWN нашего wndproc:

case WM_KEYDOWN:
{
switch(wParam)
    {
    case VK_CONTROL:
        {
            isHoldingCtrl = true;
        }
        break;
    case VK_SHIFT:
        {
            isHoldingShift = true;
        }
        break;
    case VK_NUMPAD1:
        }
            numPad = 1;
        }
        break;
    }
}
break;

Это позволяет нам использовать любую клавишу в качестве модификатора (например, клавиши numpad), что нам нужно сделать в этом проекте. Затем мы определяем «нормальные» ключевые события в WM_KEYUP.

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

0 голосов
/ 09 февраля 2012

Это было давно, но у вашего wndproc должно быть несколько параметров, один из которых - wParam.У wParam будут коды виртуальных ключей.в зависимости от того, насколько глубоко вы хотите получить, вы можете использовать внутренний переключатель, например:

switch (wParam)
{
   case MK_CONTROL:
   {
        // handle mouse and ctrl key down
        break;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...