Вы можете указать Windows отправлять вам сообщение, в частности, сообщение WM_MOUSELEAVE
, когда мышь покидает элемент управления.Для этого вызовите функцию TrackMouseEvent
.В структуре TRACKMOUSEEVENT
укажите флаг TME_LEAVE
.
По запросу, некоторый код:
Когда элемент управления создани когда мышь находится внутри клиентской области элемента управления, сообщите Windows, что вы хотите получать уведомления о выходе мыши из элемента управления:
procedure TMyControl.SetMouseEvent;
var
tme: TTrackMouseEvent;
begin
tme.cbSize := sizeof(tme);
tme.dwFlags := TME_LEAVE;
tme.hwndTrack := Self.Handle;
TrackMouseEvent(tme);
end;
Вызовите эту процедуру, когда элемент управления будет создан, а мышьвнутри контроля.Теперь вам просто нужно послушать сообщение WM_MOUSELEAVE
.В вашей WndProc
процедуре (защищенный член класса) добавьте WM_MOUSELEAVE
case.
procedure TMyControl.WndProc(var Message: TMessage);
begin
inherited;
case Message.Msg of
WM_MOUSELEAVE:
beep;
end;
end;
Я думаю, что Windows удаляет запрос уведомления, когда сообщение создано, поэтому вам нужноповторно запросить уведомление, когда вы получили сообщение.Вы не можете вызвать SetMouseEvent
в WndProc
, потому что при вызове TrackMouseEvent
мышь должна находиться внутри клиентской области элемента управления.Я думаю, что вы можете поместить свой SetMouseEvent
в OnMouseMove
элемента управления:
procedure TMyControl.WndProc(var Message: TMessage);
begin
inherited;
case Message.Msg of
WM_MOUSELEAVE:
beep;
WM_MOUSEMOVE:
SetMouseEvent;
end;
end;
Я не проверял код выше себя, потому что я использую более новую версию Delphi, Delphi 2009, котораяделает подобные вещи негласно (я думаю, потому что теперь в элементах управления есть OnMouseLeave
событие), и я думаю, что это будет мешать.