Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.09;
Скачать: CL | DM;

Вниз

OnMouseMove   Найти похожие ветки 

 
Leech   (2004-02-26 13:37) [0]

Есть такое событие, как OnMouseMove... А как узнать, что движение мыши перестало происходить над объектом?


 
Silver Alex ©   (2004-02-26 13:47) [1]

отлавливать сообщение WM_MOUSELEAVE


 
Leech   (2004-02-26 13:50) [2]

2 Silver Alex
можно пример?


 
Leech   (2004-02-26 13:57) [3]

2 Silver Alex
В справочной системе отсутствует информация о WM_MOUSELEAVE...
Есть WM_MOUSEFIRST, WM_MOUSELAST и WM_MOUSEMOVE...


 
Silver Alex ©   (2004-02-26 13:57) [4]

попутал, сообщение CM_MOUSELEAVE

...
public
{ Public declarations }
old: TWndMethod;
procedure newWNDProc(var Msg: TMessage);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
old:=Button1.WindowProc;
Button1.WindowProc:=newWNDProc;
end;
procedure TForm1.newWNDProc(var Msg: TMessage);
begin
old(Msg);
if Msg.Msg =CM_MOUSELEAVE then
begin
Button1.Caption:="no mouse";
end;
end;

procedure TForm1.Button1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Button1.Caption:="ok mouse";
end;


 
pasha_golub ©   (2004-02-26 14:21) [5]

Можно и проще OnExit, исходя из вопроса.


 
Vlad40   (2004-02-26 14:25) [6]


> pasha_golub © (26.02.04 14:21) [5]


А причем здесь OnExit? OnExit нельзя


 
Silver Alex ©   (2004-02-26 14:25) [7]

OnExit происходит когда теряется фокус, и мыша здесь ни при чем.А исходя из вопроса нужна именно мыша


 
Vlad40   (2004-02-26 15:26) [8]


> Silver Alex © (26.02.04 13:57) [4]

В развитие вопроса: а если у тебя 20 (к примеру) кнопочек и ты хочешь выполнять для них одинаковую процедуру OnMouseLeave, как ты в своей newWNDProc определишь для какой кнопки выполнять действие?


 
Rouse_ ©   (2004-02-26 15:49) [9]

Думаю что предложенные варианты не совсем верно описывают решение.
Первое:
Дело в том что сообщение CM_MOUSELEAVE приложение отсылает в DoMouseIdle которое непосредственно вызывается в Application.OnIdle так что есть большая вероятность пропустить факт выхода курсора за пределы формы.
Второе:
Как вариант - можно сделать проверку границ формы и координат мыши по таймеру.
Ну и третье:
Самый оптимальный способ - это установка хука на WH_MOUSE.


 
serge ©   (2004-02-26 15:56) [10]

В дополнение к Rouse_ © (26.02.04 15:49) [9]


var
HookHandle: hHook;

function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
var
msg: PEVENTMSG;
key: integer;
begin
if Code >= 0 then begin
result := 0;
msg := Pointer(LParam);
with Form1 do
case msg.message of
//здесь обрабатываешь позицию мауса, например
WM_MOUSEMOVE: Caption := IntToStr(msg.ParamL) + #32 + IntToStr(msg.ParamH);

end;
end else
result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, HInstance, 0);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if HookHandle > 0 then
UnhookWindowsHookEx(HookHandle);
end;



 
Игорь Шевченко ©   (2004-02-26 17:16) [11]

Rouse_ © (26.02.04 15:49)


> Второе:
> Как вариант - можно сделать проверку границ формы и координат
> мыши по таймеру.
> Ну и третье:
> Самый оптимальный способ - это установка хука на WH_MOUSE.


Самый оптимальный способ - это написание мышиного драйвера и замена стандартного своим написанным.

RTFM SetCapture/ReleaseCapture



Страницы: 1 вся ветка

Текущий архив: 2004.03.09;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.022 c
14-25881
Vitally
2004-02-16 03:48
2004.03.09
try...except и if then использовать надо


3-25705
Belkova
2004-02-10 16:58
2004.03.09
Уважаемые мастера Delphi! Подскажите, как организовать цикл по вы


8-25830
Kein
2003-10-27 18:55
2004.03.09
Вопрос к тем кто работал с DelphiX


1-25761
Ш-К
2004-02-26 16:06
2004.03.09
Sets to Int


14-25913
XsID
2004-02-15 21:00
2004.03.09
Проблемма!!!