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, вероятно, вызовет путаницу.