В Windows 7 я пытался сделать кнопку, нарисованную владельцем. Я создал подкласс для кнопки, чтобы получить более точные события ввода мыши / отпускания мыши, по сути. При этом я использовал TrackMouseEvent, когда получил WM_MOUSEMOVE, потому что он публикуется только тогда, когда мышь находится над кнопкой. Если он еще не установлен, я бы установил логическое значение, чтобы указать, что указатель мыши находится над кнопкой, а также вызвал TrackMouseEvent, чтобы при каждом оставлении мыши я мог сбросить логическое значение. Однако, как и вы, я не получал WM_MOUSELEAVE, когда я нажимал и удерживал левую кнопку мыши на кнопке, нарисованной владельцем, а затем вытаскивал мышь. Отпустив мышь за пределы кнопки, я внезапно получаю сообщение WM_MOUSELEAVE - слишком поздно.
Я определил, что причиной этого поведения было то, что обработка кнопки по умолчанию для WM_LBUTTONDOWN вызывает SetCapture и освобождает его позже. Использование SetCapture - это то, что нарушает наш прием события WM_MOUSELEAVE. Однако, как побочный эффект от вызова SetCapture, мы получим события WM_MOUSEMOVE, даже если элемент управления не находится под мышью. Таким образом, мой обходной путь дублирует логику в WM_MOUSELEAVE в обработчике WM_MOUSEMOVE, чтобы сбросить мой логический параметр, который указывает, что мышь находится над кнопкой, если я получаю событие mousemove, которое находится вне области моей кнопки. Если SetCapture фактически не используется внутри WM_LBUTTONDOWN для кнопки по умолчанию, тогда мы уже получим наше сообщение WM_MOUSELEAVE, и код все равно будет работать ... так что этот обходной путь работает в обоих случаях.
Ваша проблема звучит так, как будто она, вероятно, идентична моей, так что, надеюсь, это поможет вам.