delphi – 鼠标拖出边界后,控件如何接收鼠标事件?
发布时间:2020-12-15 09:43:46 所属栏目:大数据 来源:网络整理
导读:我正在创建一个自定义控件,可以识别拖动鼠标的时间,特别是使用消息WM_LBUTTONDOWN,WM_LBUTTONUP和WM_MOUSEMOVE.当鼠标按下时,我捕获控件上的位置,然后当鼠标移动时,如果鼠标左键按下,我会做更多处理(在起点和终点之间计算). 问题是,我希望鼠标不受控制,甚至
我正在创建一个自定义控件,可以识别拖动鼠标的时间,特别是使用消息WM_LBUTTONDOWN,WM_LBUTTONUP和WM_MOUSEMOVE.当鼠标按下时,我捕获控件上的位置,然后当鼠标移动时,如果鼠标左键按下,我会做更多处理(在起点和终点之间计算).
问题是,我希望鼠标不受控制,甚至超出窗体,但是当鼠标离开控件时,它不再捕获鼠标事件.有没有一种方法可以处理WM_MOUSEMOVE和WM_LBUTTONUP消息,而鼠标不在控件之上? 解决方法
Releasecapture适用于Wincontrols,另一种方式可能是Mousehook.那只是一个演示….
unit MouseHook; // 2012 by Thomas Wassermann interface uses Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs; type TForm3 = class(TForm) procedure FormDestroy(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form3: TForm3; implementation var HookHandle: Cardinal; Type tagMSLLHOOKSTRUCT = record POINT: TPoint; mouseData: DWORD; flags: DWORD; time: DWORD; dwExtraInfo: DWORD; end; TMSLLHOOKSTRUCT = tagMSLLHOOKSTRUCT; PMSLLHOOKSTRUCT = ^TMSLLHOOKSTRUCT; {$R *.dfm} function LowLevelMouseProc(nCode: Integer; wParam: wParam; lParam: lParam): LRESULT; stdcall; var Delta:Smallint; begin if (nCode >= 0) then begin Form3.Caption := Format('X: %d Y: %d ',[PMSLLHOOKSTRUCT(lParam)^.Point.X,PMSLLHOOKSTRUCT(lParam)^.Point.Y]); if wParam = WM_LButtonDOWN then Form3.Caption := Form3.Caption + ' LD'; if wParam = WM_LButtonUP then Form3.Caption := Form3.Caption + ' LU'; if wParam = WM_RButtonDOWN then Form3.Caption := Form3.Caption + ' RD'; if wParam = WM_RButtonUP then Form3.Caption := Form3.Caption + ' RU'; if wParam = WM_MOUSEMOVE then Form3.Caption := Form3.Caption + ' Move'; Delta := PMSLLHOOKSTRUCT(lParam)^.mouseData shr 16; if wParam = WM_MOUSEWHEEL then begin Form3.Caption := Form3.Caption + ' Wheel ' ; if Delta=120 then Form3.Caption := Form3.Caption + ' KLICK' else if Delta > 0 then Form3.Caption := Form3.Caption +' UP' else if Delta < 0 then Form3.Caption := Form3.Caption +' DOWN' end; if wParam = WM_MOUSEHWHEEL then begin Form3.Caption := Form3.Caption + ' HWheel'; if Delta=120 then Form3.Caption := Form3.Caption + ' KLICK' else if Delta > 0 then Form3.Caption := Form3.Caption +' UP' else if Delta < 0 then Form3.Caption := Form3.Caption +' DOWN' end; Form3.Caption := Form3.Caption +' >> '+ IntToStr(Delta) end; Result := CallNextHookEx(HookHandle,nCode,wParam,lParam); end; function InstallMouseHook: Boolean; begin Result := False; if HookHandle = 0 then begin HookHandle := SetWindowsHookEx(WH_MOUSE_LL,@LowLevelMouseProc,hInstance,0); Result := HookHandle <> 0; end; end; procedure TForm3.FormCreate(Sender: TObject); begin InstallMouseHook; end; procedure TForm3.FormDestroy(Sender: TObject); begin if HookHandle <> 0 then UnhookWindowsHookEx(HookHandle); end; end. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |