Страница 1 из 1

Не приходит сообщение WM_SETFOCUS

Добавлено: 26 авг 2015, 07:28
Сионист
Обрабатываю WM_LBUTTONDOWN, выполняю

Код: Выделить всё

SetFocus(Window);
, сообщение WM_SETFOCUS приходит. Снова обрабатываю WM_LBUTTONDOWN, выполняю

Код: Выделить всё

SendMessage(Window, WM_KILLFOCUS, 0, 0);
, оно приходит, обрабатываю его, выполняю

Код: Выделить всё

DefWindowProc(Window, Message, First, Second);
. Снова обрабатываю WM_LBUTTONDOWN, выполняю

Код: Выделить всё

SetFocus(Window);
, но сообшение WM_SETFOCUS уже не приходит. Что я делаю не так?

Re: Не приходит сообщение WM_SETFOCUS

Добавлено: 26 авг 2015, 11:03
Romeo
Неправильно ты делаешь то, что посылаешь WM_KILLFOCUS вручную.

Ты не обратил внимание, что для отправки сообщения WM_SETFOCUS есть отдельная API SetFocus, а для сообщения WM_KILLFOCUS такой API функции нет. Знаешь почему так? Потому, что WM_KILLFOCUS - это нотификация. Она не должна слаться программистом. Её может генерировать только сама операционная система. Если ты вместо ручной проброски WM_KILLFOCUS вызовешь SetFocus для другого элемента управления, то твой элемент управления потом получит WM_KILLFOCUS уже от операционной системы и это будет правильным. К тому же операционная система правильного заполнит wParam, который при ручной обработке ты не заполняешь, что скорее всего и является причиной того, что фокус у тебя залипает и дальше не хочет даже устанавливаться.

Re: Не приходит сообщение WM_SETFOCUS

Добавлено: 26 авг 2015, 11:10
Сионист
Если ты вместо ручной проброски WM_KILLFOCUS вызовешь SetFocus для другого элемента управления, то твой элемент управления потом получит WM_KILLFOCUS уже от операционной системы и это будет правильным.
Спасибо. Но у меня нет окна, которое должно получить фокус. Его надо просто сбросить, а не переключить на другое окно.

Re: Не приходит сообщение WM_SETFOCUS

Добавлено: 26 авг 2015, 11:34
Romeo
Тогда SetFocus(NULL). Но WM_KILLFOCUS руками никак нельзя звать.

Re: Не приходит сообщение WM_SETFOCUS

Добавлено: 28 авг 2015, 06:59
Сионист
Вот спасибо. Сразу решилась и проблема невозможности преобразовать размеры и положение каретки в процессе обработки WM_SETFOCUS и WM_PAINT.