В Windows всплывают пузырьки, но они основаны исключительно на сообщении.MouseWheel пузырится, например, но ни MouseEnter, ни Leave не делают.Добавление пузырящего поведения технически возможно, но очень трудно понять правильно.Каждое окно в родительском / дочернем дереве должно взаимодействовать и явно связываться с их родителями.
В любом случае, это не решает проблему в данном конкретном случае.Ключевая проблема заключается в том, что нет гарантии, что MouseLeave для дочернего элемента управления обеспечит MouseEnter для родителя.Сообщения о перемещении мыши недостаточно точны, они не гарантируют, что сообщается о каждом пройденном пикселе.Когда у вас есть дочернее окно близко к краю его родителя, довольно просто не получить MouseEnter для родителя, когда вы перемещаете мышь достаточно быстро.
Это решается с помощью захвата мыши, Control.Захват собственности.Это гарантирует, что сообщение о перемещении мыши генерируется, даже если мышь больше не находится внутри прямоугольника клиента окна.Однако это хорошо работает при мониторинге мыши для одного окна, а не для нескольких окон.Как только вы нажимаете на элемент управления, сам элемент управления обычно хочет захватить мышь, отменяя тот, который вы запустили.Например, кнопка делает это, она хочет видеть событие MouseUp, чтобы она могла перерисовать кнопку, чтобы показать состояние кнопки.
Жесткие файлы cookie.Единственный достойный подход, который я знаю для этой конкретной проблемы, это использовать таймер.200 мсек обычно достаточно, запустите его, когда мышь войдет.В обработчике событий Tick используйте Mouse.Position и Control.PointToClient, чтобы проверить, находится ли мышь по-прежнему внутри прямоугольника внешнего окна.