Вы должны получить сообщение окна WM_MOUSELEAVE автоматически, когда мышь покидает клиентскую область, и обработка этого сообщения базовым классом вызовет метод OnMouseLeave.Если это действительно не происходит, вы, конечно, можете обойти это.Просто перехватите WM_MOUSEMOVE напрямую, а затем сделайте вызов Win32 API, который попросит вас получить уведомление, когда мышь покинет ваш контроль.
Используйте следующее простое переопределение WndProc ...
private bool _mouseOver = false;
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case PI.WM_MOUSEMOVE:
if (!_mouseOver)
{
PI.TRACKMOUSEEVENTS tme = new PI.TRACKMOUSEEVENTS();
tme.cbSize = (uint)Marshal.SizeOf(typeof(PI.TRACKMOUSEEVENTS));
tme.dwHoverTime = 100;
tme.dwFlags = (int)(PI.TME_LEAVE);
tme.hWnd = Handle;
PI.TrackMouseEvent(ref tme);
_mouseOver = true;
}
base.WndProc(ref m);
break;
case PI.WM_MOUSELEAVE:
_mouseOver = false;
base.WndProc(ref m);
break;
}
}
И нужная вам информация для платформы: ...
internal const int WM_MOUSEMOVE = 0x0200;
internal const int WM_MOUSELEAVE = 0x02A3;
internal const int TME_LEAVE = 0x0002;
[StructLayout(LayoutKind.Sequential)]
internal struct TRACKMOUSEEVENTS
{
public uint cbSize;
public uint dwFlags;
public IntPtr hWnd;
public uint dwHoverTime;
}
Надеюсь, что поможет.