Шпионаж при перетаскивании строки заголовка окна - PullRequest
1 голос
/ 04 августа 2010

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

Сводка сообщений, полученных от шпиона:

WM_SYSCOMMAND (SC_MOVE)

WM_MOUSEMOVE (*)

WM_CAPTURECHANGED

WM_ENTERSIZEMOVE

WM_MOUSEMOVE (*)

. , .

WM_MOUSEMOVE (*)

WM_LBUTTONUP (*)

WM_CAPTURECHANGED

WM_EXITSIZEMOVE

WM_SYSCOMMAND (возврат)

Я пытаюсь понять сообщения с помощью (*). Они не имеют смысла для меня, так как:

1) Движения мыши и отпускание кнопки НЕ находятся в клиентской области окна. Поэтому вместо WM_MOUSEMOVE и WM_LBUTTONUP у меня должны быть WM_NCMOUSEMOVE и WM_NCLBUTTONUP.

2) Если я ставлю перерыв в этих сообщениях (WM_MOUSEMOVE и WM_LBUTTONUP), в моей оконной процедуре я не перехватываю эти сообщения при перетаскивании строки заголовка окна !!!

1 Ответ

0 голосов
/ 04 августа 2010

1) Движения мыши и отпускание кнопки НЕ находятся в клиентской области окна. Поэтому вместо WM_MOUSEMOVE и WM_LBUTTONUP у меня должны быть WM_NCMOUSEMOVE и WM_NCLBUTTONUP.

Я не уверен насчёт этого, но могу догадаться: возможно, система всегда отправляет WM_MOUSEMOVE, и это конвертируется в WM_NCMOUSEMOVE где-то по пути (в зависимости от результата WM_NCHITTEST).

Во время операции перетаскивания ваше приложение все равно не видит эти сообщения (как вы заметили), поэтому нет смысла выполнять преобразование.

2) Если я ставлю перерыв в этих сообщениях (WM_MOUSEMOVE и WM_LBUTTONUP), в моей оконной процедуре я не перехватываю эти сообщения при перетаскивании строки заголовка окна !!!

Напомним, что WM_MOUSEMOVE и друзья опубликованы, а не отправлены. Это означает, что они обычно будут проходить через ваш собственный цикл сообщений и попадать в вашу оконную процедуру через DispatchMessage.

Когда вы начинаете перетаскивать окно, приложение вводит так называемый модальный цикл сообщений. Этот цикл не вернется, пока не будет завершено перетаскивание, поэтому до этого времени ваш собственный цикл сообщений не будет запущен! Сообщения WM_ENTERSIZEMOVE и WM_EXITSIZEMOVE отправляются в оконную процедуру при входе и выходе из модального цикла соответственно.

Теперь, возможно, модальный цикл также отправляет сообщения в вашу оконную процедуру; но (по крайней мере для WM_MOUSEMOVE и тому подобное) это не так. И это не должно произойти, потому что модальный цикл сам обрабатывает эти сообщения - их передача в winproc, вероятно, вызовет путаницу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...