2016-12-21 2 views
0

Я хотел бы обнаружить событие перемещения мыши, когда он перемещается за пределы окна, используя MFC. Я использовал OnNcMouseMove(), но он только обнаруживает событие перемещения мыши, когда он перемещается в область неклиента, а не за окном. Итак, как я могу это сделать, чтобы обнаружить, пока мышь двигается за окном?Как определить, когда мышь перемещается за окно?

+5

Если вам нужно только знать, когда мышь покидает ваше окно, вы можете использовать [WM_MOUSELEAVE] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms645615.aspx). Если вам нужно постоянно следить за движением мыши за окном, вам придется перейти с [SetCapture] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms646262.aspx). – IInspectable

+0

Можно ли получить координаты точки мыши, когда мышь находится за окном? –

+0

Если вы настроили захват мыши, вы продолжаете получать сообщения 'WM_MOUSEMOVE', даже если курсор мыши находится за пределами вашего окна. Если вам нужно запросить позицию курсора в определенное время, вы можете вызвать [GetCursorPos] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms648390.aspx). И если вы оказались в обработчике сообщений, я считаю, что вы можете вызвать [GetMessagePos] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms644938.aspx), чтобы получить позицию курсора в время создания сообщения. Это во многом зависит от того, что вы пытаетесь выполнить. – IInspectable

ответ

0

Все, что я сделал, было настроено на 100 мс таймер, который вызывает GetCursorPos(). Вы можете настроить это значение таймера, чтобы сделать его более высоким, если нужно, более высокое разрешение, но для моего конкретного пользовательского интерфейса 100 мс было достаточно хорошим - он сбрасывал (x, y) координаты в строку состояния.

+1

Как и все подходы, основанные на выборке, он не учитывает события, которые происходят между точками выборки. Если мышь покидает окно, но вводит его перед тем, как вы запрашиваете следующий образец, вы пропустили эквивалент сообщения «WM_MOUSELEAVE». Этого не происходит с «TrackMouseEvent». Я не знаю, важно ли это для ОП, но, не зная, этот ответ нужно взять с солью. – IInspectable