Есть несколько уведомлений, основанных на том, что происходит.
Если вы выбираете элемент, но ничего еще не выбрано, вы получите одно уведомление об изменении LVIF_STATE: uNewState & LVIS_SELECTED. Новый выбранный предмет будет найден по адресу:
pNMListView->iItem
Если элемент выбран до выбора нового объекта, вы получите три изменения состояния:
Сначала вам сообщат, что предыдущий элемент в фокусе теряет фокус:
pNMListView->uOldState & LVIS_FOCUSED
Затем вы получите уведомление о том, что старый элемент не выбран:
pNMListView->uOldState & LVIS_SELECTED
Наконец, вы получите новое состояние выбора предмета:
pNMListView->uNewState & LVIS_SELECTED
(снова посмотрите на iItem для вновь выбранного элемента)
Итак, ловушка, с которой мы столкнулись, состоит в том, что, поскольку отмена выбора элемента приводит к двум уведомлениям, мы выполняем много повторяющихся, иногда вредных, обработок. В итоге мы выполнили эту обработку только для 2-го сообщения (pNMListView->uOldState & LVIS_SELECTED)
и пропустили ту же обработку после уведомления о потере фокуса.