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
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.
jak nie ma to dodaj do FAQ
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)
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
Fajny kodzik, tylko że nie mogę przechwycić wciskanych klawiszy kiedy myszka znajduje się na belce programu. Jak ten kodzik poprawić.