Wykrywanie wcisnięcia przycisku myszki

0

jak wykryć czy użytkownik wcisnął przycisk w myszce i który ...nie wazne czy to będzie w mojej aplikacji czy poza nią?? coś jak spy_klawiatury

0

Hook Na myszke (Modyfi KAC ja)

Plik HookCommon.pas

unit HookCommon;


interface

uses Windows;

//Tu sobie wymyślam zmienne którebędą reprezentowły "Stan" myszki
type TClickDetection =(cRightDown=1,CLeftDown=2 ,CRightUp=3 ,CLeftUp=4);
var
  MouseHookMessage: Cardinal;

procedure HookMouse;
procedure UnHookMouse;

implementation

procedure HookMouse; external 'MouseHook.DLL';
procedure UnHookMouse; external 'MouseHook.DLL';

initialization
  MouseHookMessage := RegisterWindowMessage('MouseHookMessage');
end.

DllKa

library MouseHook;

uses
  Forms,
  Windows,
  Messages,
  HookCommon in 'HookCommon.pas';

{$J+}
const
  Hook: HHook = 0;
{$J-}


{$R *.res}

function HookProc(nCode: Integer; MsgID: WParam; Data: LParam): LResult; stdcall;
var
  MouseDetection : TClickDetection;
begin
Case MsgID of
WM_LBUTTONDOWN :    MouseDetection :=cLeftDown;
WM_RBUTTONDOWN :    MouseDetection :=cRightDown;
WM_LBUTTONUP      :    MouseDetection :=cLeftUP;
WM_RBUTTONUP      :    MouseDetection :=cRightUP;
end;


    PostMessage(FindWindow('TMainHookTestForm', nil), MouseHookMessage, MsgID, Integer(MouseDetection));
{ tutaj DllKa szuka okienka do którego ma skierować komunikatwięc szukamy to okienko po jego klasie
aby program działał to w miejsce 'TMainHookTestForm' należy podać Nazwe klasy swojej aplikacji 
czyli Jeśli masz Forme główą o nazwie (Name) = MainForm to w to miejsce wpisujesz TMainForm'}

  Result := CallNextHookEx(Hook,nCode,MsgID,Data);
end;

procedure HookMouse; stdcall;
begin
  if Hook = 0 then Hook:=SetWindowsHookEx(WH_MOUSE,@HookProc,HInstance,0);
end;

procedure UnHookMouse; stdcall;
begin
  UnhookWindowsHookEx(Hook);
  Hook:=0;
end;

exports
  HookMouse, UnHookMouse;

begin
end.

Program główny (Aplikacja)

unit Main;



interface

uses
  HookCommon,
  Windows, Messages, SysUtils, Variants, Classes, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;
type
  TMainHookTestForm = class(TForm)
    procedure FormDestroy(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    procedure Signal(MouseDetection : TClickDetection);
  protected
    procedure WndProc(var Message: TMessage); override;
  public
  end;

var
  MainHookTestForm: TMainHookTestForm;
implementation

{$R *.dfm}

{ TMainHookTestForm }


procedure TMainHookTestForm.FormCreate(Sender: TObject);
begin
  HookCommon.HookMouse;
end;

procedure TMainHookTestForm.FormDestroy(Sender: TObject);
begin
  HookCommon.UnHookMouse;
end;

procedure TMainHookTestForm.Signal(MouseDetection : TClickDetection);

begin
  case MouseDetection of
  cleftDown:Caption:='Lewy Wcisnięty';
  cRightDown:Caption:='Prawy Wcisnięty';
  cleftUp:Caption:='Lewy Puszczony';
  cRightUp:Caption:='Prawy Puszczony';
  end;
end;

procedure TMainHookTestForm.WndProc(var Message: TMessage);
begin
  inherited WndProc(Message);

  if Message.Msg = HookCommon.MouseHookMessage then
  begin
    Signal(TClickDetection(Message.LParam));
  end;
end;

end.

0

jak nie ma to dodaj do FAQ

0

a jak zrobić żeby wykrywał jeszcze wciśnięcie i zwolnienie przycisku prawego lewego..ale to już może być w mojej aplikacji ..pewnie chodzi o procedury onmausedown i onmauseup..tylko jak tam wykryć który przycisk został naciśnięty ...może jest jakoś łatwiejszy tam sposób
[edit]
sprawdzałem to na imagu
juz mam w funkcji jest parametr button i przyjmuje on wartości :(mbLeft, mbRight, mbMiddle)

0

dodaj sobie w dllce obsługe WM_LBUTTONUP (analogicznie jak Wm_Down) i w mousedetection dodaj sobie jakąś zminnną np. CleftUp CRightUp (ModyfiKacja powyżej)
musi być hook w dllce bo tylko dllka może obsłużyć wiele okien prawidłowo

[diabel] Avast wykrywa kod jako wirus [diabel] Już 2 raz niechcący napisałem coś co przypomina wira
(zupełnie nieświadomie) I wersja normalna a ta już widoczna jako wir

0

Fajny kodzik, tylko że nie mogę przechwycić wciskanych klawiszy kiedy myszka znajduje się na belce programu. Jak ten kodzik poprawić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1