Wykrywanie wcisnięcia przycisku myszki

Odpowiedz Nowy wątek
2006-11-24 20:27
myszka
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

Pozostało 580 znaków

2006-11-24 21:38
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.

Pozostało 580 znaków

2006-11-25 00:49
0

jak nie ma to dodaj do FAQ


- Ciemna druga strona jest.
- Nie marudź Yoda, tylko jedz tego tosta.
Google NIE GRYZIE!
Pomogłem - kliknij

Pozostało 580 znaków

2006-11-25 10:48
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)


"Nie po to piszę programy żeby korzystać z cudzych"

Pozostało 580 znaków

2006-11-25 22:31
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

Pozostało 580 znaków

2009-06-21 16:55
0

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


Iucundi acti labores

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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