Если пользователь щелкнет левой кнопкой мыши в рабочей области окна (которая включает в себя клиентскую и не клиентскую области), Windows сделает активным окно, в котором вы произвели щелчок, и затем передаст оконной процедуре сообщение WM_LBUTTONDOWN. Обычно, сообщения WM_LBUTTONDOWN и WM_LBUTTONUP приходят парой, однако возможны исключения. Например, это может случиться, если кнопка мыши нажимается в одном окне, мышь перемещается в ваше окно, и кнопка отпускается. в этом случае, первое окно получит только сообщение WM_LBUTTONDOWN, а ваше окно получит сообщение WM_LBUTTONUP.
В некоторых случаях программе может потребоваться получать сообщения мыши и в том случае, когда курсор мыши находится вне окна. Например, в графических редакторах, когда фигура (линия, прямоугольник и т.п.) начинает рисоваться по нажатию мыши, а заканчивает рисоваться – по отпусканию кнопки мыши. В этом случае, сообщение об отпускании мыши должно прийти в то же окно, несмотря на то, что мышь перемещена за его пределы. Это возможно при использовании механизма захвата мыши.
Для захвата мыши используется функция:
SetCapture(hWnd);
После вызова этой функции, Windows посылает все сообщения мыши в оконную процедуру того окна, описателем которого является hWnd. Сообщения мыши в этом случае всегда будут оставаться сообщениями рабочей области, даже, если мышь перемещается в нерабочей области окна. Координаты мыши все равно передаются в оконных координатах, в связи с чем они могут принимать отрицательное значение (если мышь окажется выше или левее рабочей области окна). Для освобождения мыши программа обязательно должна вызвать функцию:
ReleaseCapture();
Эта функция возвращает обработку мыши в нормальный режим.