Форум: "Основная";
Текущий архив: 2004.03.09;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c