Jak w delphi zrobic program, ktory bedzie liczyl ilosc klikniec myszy?
Na formie w zakładce onclick daj
i:=i+1;
label1.caption:='Klieknieto '+IntToStr(i)+' razy';
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
Serio? :-)
lamer napisał:
Serio? :-)
Nie na żarty :D --Delphi 6
Pozdrowienia{hello} ,
Imperior
A szkoda bo już myślałem... {hello}
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<>nil then
CreateHook(Handle);
end;
procedure TFormMouseHook.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if DllInstance<>0 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 < 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<>0;
end;
procedure KillHook; stdcall;
begin
if hhk<>0 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
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
Jescze znalazlem blad. A raczej pozostalosc po eksperymentach.
pq napisał:
>TCreateHook=function (HWnd: THandle) : Boolean; stdcall;
function : Boolean....
>var
> FormMouseHook: TFormMouseHook;
> DLLInstance, HWindow: THandle;
Hwindow - niepotrzebne!
> else
> @CreateHook:=GetProcAddress(DllInstance,'CreateHook');
> if @CreateHook<>nil the
> CreateHook(Handle);
CreateHook;
>DLL:
>
>var
>hhk :HHOOK;
>FormHandle: THandle;
FormHandle niepotrzebne
>
>function CreateHook(HWnd: THandle) : Boolean; stdcall;
CreateHook : Boolean...
>begin
> 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.