Jak to zrobic w delphi?(Mysz)

0

Jak w delphi zrobic program, ktory bedzie liczyl ilosc klikniec myszy?

0

Na formie w zakładce onclick daj
i:=i+1;
label1.caption:='Klieknieto '+IntToStr(i)+' razy';

0

lamer napisał:
Na formie w zakładce onclick daj

i:=i+1;
label1.caption:=\'Klieknieto \'+IntToStr(i)+\' razy\';
Tak, ale to będzie zliczało kliknięcia na formie!--Delphi 6
Pozdrowienia{hello} ,
Imperior

0

Serio? :-)

0

lamer napisał:
Serio? :-)

Nie na żarty :D --Delphi 6
Pozdrowienia{hello} ,
Imperior

0

A szkoda bo już myślałem... {hello}

0

No to juz umiem. Ponizszy program zlicza liczbe klikniec lewym guzikiem.

Niestety, program MUSI skladac sie z programu i DLLa - inaczej nie moze byc.

Forma:

Nazwa: FormMouseHook (zarowno Caption jak i Name)
typ TFormMouseHook
(potrzebne jest to wlasciwego funcjonowania FindWindow - nie wiem dlaczego, bo wg msdn-u szuka po Caption i typie ale tylko tak dzialalo)

Na formie Label1

Program:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Forms,
Controls, StdCtrls;

const
WM_GOTCLICK=WM_USER+572;

type
TFormMouseHook = class(TForm)
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
procedure RefreshClicks(var Msg: TMessage); message WM_GOTCLICK;
{ Private declarations }
public
{ Public declarations }
end;

TCreateHook=function (HWnd: THandle) : Boolean; stdcall;

var
FormMouseHook: TFormMouseHook;
DLLInstance, HWindow: THandle;
clicks: longint;
CreateHook:TCreateHook;

implementation

{$R *.dfm}

procedure TFormMouseHook.FormCreate(Sender: TObject);

begin
clicks:=0;
Label1.Caption:='0';
DLLInstance:=LoadLibrary('Hook1DLL.dll');
If DLLInstance=0 then
begin
Label1.Caption:='DLL not loaded';
end
else
@CreateHook:=GetProcAddress(DllInstance,'CreateHook');
if @CreateHook&lt&gtnil then
CreateHook(Handle);

end;

procedure TFormMouseHook.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if DllInstance&lt&gt0 then FreeLibrary(DLLInstance);
end;

procedure TFormMouseHook.RefreshClicks(var Msg: TMessage);
begin
inc(clicks);
Label1.Caption:=IntToStr(clicks);
end;

end.

DLL:

library Hook1DLL;

{$IMAGEBASE $66000000}

uses
Windows,
Messages;

{$R *.res}

const
WM_GOTCLICK=WM_USER+572;

var
hhk :HHOOK;
FormHandle: THandle;

function MouseProc(nCode : integer; WPARAM : wParam; LPARAM :lParam) :lresult;
stdcall;
begin
if (nCode &lt 0) then // do not process the message
begin
Result:=CallNextHookEx(hhk, nCode, wParam, lParam);
Exit;
end;

if (wparam=WM_LBUTTONDOWN) or (wparam=WM_NCLBUTTONDOWN) then
begin
SendMessage(FindWindow('TFormMouseHook','FormMouseHook'), WM_GOTCLICK, 0, 0);
end;

Result:=CallNextHookEx(hhk, nCode, wParam,
lParam);

end;

function CreateHook(HWnd: THandle) : Boolean; stdcall;
begin
FormHandle:=FindWindow('TFormMouseHook','FormMouseHook');
hhk:=SetWindowsHookEx(WH_MOUSE, MouseProc, HInstance,0);
Result:=hhk&lt&gt0;
end;

procedure KillHook; stdcall;
begin
if hhk&lt&gt0 then
begin
UnhookWindowsHookEx(hhk);
hhk:=0;
end;
end;

procedure CloseDLL(Reason:Integer);
begin
if Reason=DLL_PROCESS_DETACH then
KillHook;

end;

exports
MouseProc,
CreateHook,
KillHook;

begin
DLLProc:=@CloseDLL;

end.

Pozdarwiam, a jak ktos ma uwagi to chetnie uslysze!--Pawel

Delphi6

0

Wlasnie zauwazylem, ze program jest czasem niedokladny. Np klikniecie na Menu w Excelu jest zaliczane jako 3 kliki. To chyba wina tego jak jest napisany Excel (generuje 3 komunikaty WM_LBUTTONDOWN) i ciezko to obejsc. Mozna by notowac moment klikniecia i jesli nastepne wystapi bardzo szybko po poprzednim, to go nie zaliczac. Ale nie chce mi sie tego programowac.--Pawel

Delphi6

0

Jescze znalazlem blad. A raczej pozostalosc po eksperymentach.

pq napisał:

&gtTCreateHook=function (HWnd: THandle) : Boolean; stdcall;
function : Boolean....

&gtvar
&gt FormMouseHook: TFormMouseHook;
&gt DLLInstance, HWindow: THandle;

Hwindow - niepotrzebne!

&gt else
&gt @CreateHook:=GetProcAddress(DllInstance,'CreateHook');
&gt if @CreateHook&lt&gtnil the
&gt CreateHook(Handle);

     CreateHook;

&gtDLL:
&gt
&gtvar
&gthhk :HHOOK;
&gtFormHandle: THandle;
FormHandle niepotrzebne

&gt
&gtfunction CreateHook(HWnd: THandle) : Boolean; stdcall;

          CreateHook : Boolean...

&gtbegin
&gt FormHandle:=FindWindow(\'TFormMouseHook\',\'FormMouseHook\');
niepotrzebna linijka

Probowalem zrobic FindWindow tylko raz, przy tworzeniu Hooka. Jednak MouseProc jest wywolywana oddzielnie przez kazda aplikacje, w ktorej jest klick, i te aplikacje nie maja ustawionej zmiennej FormHandle w DLLu. Trzeba wiec albo robic FindWindow przy kazdym komunikacie wysylanym przez MouseProc do okna programu zliczajacego (tak jak to zrobilem), albo zapisac Handle Formy w czyms co sie nazywa Memory Mapped File (chyba), na czym sie nie znam zupelnie :(.

Pozdrawiam

--Pawel

Delphi6

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.