При движении мыши по рабочей области окна, Windows не вырабатывает сообщение WM_MOUSEMOVE для всех возможных положений мыши

  • Количество сообщений WM_MOUSEMOVE зависит от устройства мыши и скорости, с которой оконная процедура может обрабатывать сообщения о движении мыши.

Если пользователь щелкнет кнопкой мыши в рабочей области неактивного окна,Windows сделает активным окно, в котором был произведен щелчок, и затем передаст оконной процедуре сообщение WM_LBUTTONDOWN.

  • Если приложение получает сообщение WM_LBUTTONDOWN, то ономожет уверенно считать, что в данный момент его окно активно.

Однако

  • Оконная процедура может получить сообщение WM_LBUTTONUP, не получив вначале сообщения WM_LBUTTONDOWN. Это может случиться, если кнопка мыши нажимается в одном окне, мышь перемещается в другое окно, и кнопка отпускается.

Аналогично,

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

В этих правилах есть исключения:

  • Оконная процедура может захватить мышь (capture the mouse) и продолжать получать сообщения мыши, даже если она находится вне рабочей области окна.
  • Если системное модальное окно сообщений или системное модальное окно диалога находится на экране, никакая другая программа не может получать сообщения от мыши.

Обработка нажатия клавиш <Shift> и <Ctrl> и кнопок мыши

  • При получении сообщений мыши, связанных с рабочей областью окна, через параметр wParam передается значение, позволяющее определить, были ли одновременно с этим нажаты кнопки мыши или клавиши <Shift> и <Ctrl> клавиатуры.

Например, если обработка должна зависеть от состояния клавиш <Shift> и <Ctrl>, то приложение могло бы воспользоваться следующей логикой:

UINT fwKeys = wParam; // состояние кнопок мыши if(MK_SHIFT & fwKeys) { if(MK_CONTROL & fwKeys) { /* нажаты клавиши <Shift> и <Ctrl> */ } else { /* нажата клавиша <Shift> */ } } else { if(MK_CONTROL & fwKeys) { /* нажата клавиша <Ctrl> */ } else { /* клавиши <Shift> и <Ctrl> не нажаты */ } }

Функция GetKeyStateтакже может возвращать состояние кнопок мыши или клавиш <Shift> и <Ctrl>, используя виртуальные коды клавиш VK_LBUTTON, VK_RBUTTON, VK_MBUTTON, VK_SHIFT и VK_CONTROL. При нажатой кнопке или клавише возвращаемое значение функции GetKeyState отрицательно.

  • Функция GetKeyState возвращает состояние кнопки мыши и клавиши в связи с обрабатываемым в данный момент сообщением, т.е. информация о состоянии должным образом синхронизируется с сообщением.