PDA

View Full Version : Disable mouse bằng Mouse Hook



DelphiLearner
03-05-2005, 22:03
Hi all,

Có ai biết cách hook mouse để disable phím phải chẳng hạn, khi bấm phải chuột (tại vị trí bất kỳ) thì chỉ nghe tiếng beep mà không hiện popup, tức là thông điệp chuột phải bị nhấn không thể chuyển giao cho mắt xích khác trong chuỗi hook.

Ví dụ như Click'n'See, bấm chuột phải để tra từ, không thấy hiện popup nữa.

Thanks!!!

jiSh@n
04-05-2005, 02:14
click'n'see hook mouse+keyboard để đón sự kiện tra từ và hook api để tra từ. Chi tiết về hook mouse+keyboard thì có thể xem trong Giáo trình LT+BT Delphi, hook api thì xem trong API Hooking SDK.

DelphiLearner
04-05-2005, 08:59
Không phải mình muốn làm như click'n'see mà chỉ đơn giản là khi kích chuột phải thì không xuất hiện popup nữa.
VD: Khi kích chuột phải ở ngoài Desktop chẳng hạn thì chỉ có tiếng beep mà không xuất hiện popup (chứa Copy,Paste,New .... nữa). Nói 1 cách khác là sau khi xử lý xong hook chuột thì làm mất luôn cái thông điệp mà nó gửi cho HĐH (coi như là xóa luôn thông điệp đó đi).

THE LAST LEAF
04-05-2005, 11:22
Chẹp lâu ngày ko động đến hook, chỉ cần set lại cái wParam thôi là được cho wParam := 0 xem sao

DelphiLearner
05-05-2005, 19:23
Không được. Đây là nguyên mẫu hàm MouseProc:

function MouseProc(nCode:Integer;
wParam:WPARAM;
lParam:LPARAM):LRESULT;stdcall;
begin

if nCode=HC_ACTION then
if (wParam=WM_RBUTTONDOWN){ and (wParam=MK_SHIFT)} then
begin
MessageBeep(0);
//tagMOUSEHOOKSTRUCT(Ptr(lParam)^).wHitTestCode:=HTE RROR;

//wParam:=WM_LBUTTONDOWN;
end;
Result:=CallNextHookEx(CallBackHook,nCode,wParam,l Param);
end;

Mình muốn sau khi kêu beep thì ko còn popup nữa. Tính sao đây các bro?

THE LAST LEAF
06-05-2005, 09:33
Sorry mình nhầm bạn cần trả lại giá trị cho MouseProc = - 1 nếu muốn các window không nhận đc message này



function MouseProc(nCode:Integer; wParam:WPARAM;
lParam:LPARAM):LRESULT;stdcall;
begin
if nCode=HC_ACTION then
if wParam=WM_RBUTTONDOWN then
begin
MessageBeep(0);
Result := - 1;
end;
//Chú ý là bỏ dòng này
//Result:=CallNextHookEx(CallBackHook,nCode,wParam,l Param);
end;

DelphiLearner
06-05-2005, 20:42
Mình đã thử và kết quả là không xuất hiện popup thật nhưng .... treo cứng luôn form và kể cả cửa sổ captured chuột. Điều này chắc là do bỏ CallNextHookEx().
Có ai biết cách nào khác không ? Mình thì nghĩ là phải Subclass hàm WindowProc nhưng có vẻ như là quá phức tạp cho một yêu cầu đơn giản.

THE LAST LEAF
07-05-2005, 08:34
Vậy à tui có bị sao đâu

DelphiLearner
08-05-2005, 04:31
Bạn có thể up source code được không rất cám ơn bạn. Mình đã thử lại nhưng kết quả không thay đổi vừa xuất hiện form thì chuột biến thành đông hồ cát không sử dụng được nữa.

THE LAST LEAF
09-05-2005, 14:02
Xin lỗi bạn lần nữa đoạn mã trên mình mới test trên VB, đoạn mã này đã test trên Delphi bạn hãy tham khảo chắc nó đáp ứng đc yêu cầu rồi



var
lHook : Integer;

function MouseProc(nCode:Integer; wParam:WPARAM;
lParam:LPARAM):LRESULT;stdcall;
begin
if nCode=HC_ACTION then
if wParam=WM_RBUTTONDOWN then
begin
MessageBeep(0);
Result := - 1;
end
else
Result:=CallNextHookEx(lHook,nCode,wParam,lParam);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
lHook := SetWindowsHookEx(WH_MOUSE, @MouseProc, hInstance, 0);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnHookWindowsHookEx(lHook);
end;