Я нахожу, что эта ситуация возникает время от времени, и у меня никогда не было действительно надежного общего решения.
У меня есть элемент управления - в этом примере элемент управления EDIT в диалоговом окне. Я хочу предпринять определенные действия в ответ на изменение пользователем - и только пользователем - содержимого элемента редактирования.
Управление редактированием может быть установлено программно - например, во время настройки диалогового окна может быть начальное значение, помещенное в поле редактирования. Или когда пользователь выбирает элемент из списка, текст этого выбора вполне может быть тем, что помещено в поле редактирования.
Но когда пользователь изменяет содержимое поля редактирования, мне нужно знать это и отвечать (в этом сценарии я хочу очистить выбор из соответствующего списка ).
В настоящее время я смотрю на то, какой элемент управления имеет фокус, и только EN_CHANGE считаются «от пользователя», если элемент управления имеет фокус.
Это прекрасно работает под Windows 7. Это не работает под XP (я еще не тестировал Vista).
В XP, если поле редактирования имеет фокус, но пользователь нажимает на представление списка, и представление списка сообщает элементу управления редактирования об установке его содержимого, тогда я получаю уведомление от элемента управления редактирования, который утверждает, что все еще имеет focus (:: GetFocus () == HWND контроля редактирования). Но это неправильное состояние не возникает в Win7.
Это многоуровневый интерфейс, поэтому я не могу изменить обработчик уведомлений в виде списка. Он получает изменение выбора и обновляет поле редактирования без моего участия или возможности действительно вмешиваться, кроме как получать уведомления от них обоих.
Есть мысли о том, как в общем и целом навсегда решить головоломку "Действительно ли это уведомление от пользователя"?