Код:
program HookApi;
USES
WINDOWS;
type
WPARAM = Longint;
LPARAM = Longint;
LRESULT = Longint;
DWORD = LongWord;
PDWORD = ^DWORD;
HHOOK = type LongWord;
HWND = type LongWord;
UINT = LongWord;
BOOL = LongBool;
TPoint = packed record
X: Longint;
Y: Longint;
end;
PMouseHookStruct = ^tagMOUSEHOOKSTRUCT;
tagMOUSEHOOKSTRUCT = packed record
pt: TPoint;
hwnd: HWND;
wHitTestCode: UINT;
dwExtraInfo: DWORD;
end;
PSecurityAttributes = ^_SECURITY_ATTRIBUTES;
_SECURITY_ATTRIBUTES = record
nLength: DWORD;
lpSecurityDescriptor: Pointer;
bInheritHandle: BOOL;
end;
TFNHookProc = function (code: Integer; wparam: WPARAM; lparam: LPARAM): LRESULT stdcall;
const
HC_ACTION = 0;
user32 = 'user32.dll';
kernel32 = 'kernel32.dll';
GENERIC_WRITE = $40000000;
OPEN_ALWAYS = 4;
function CallNextHookEx(hhk: HHOOK; nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT;
stdcall; external user32 name 'CallNextHookEx';
function SetWindowsHookEx(idHook: Integer; lpfn: TFNHookProc; hmod: HINST; dwThreadId: DWORD): HHOOK;
stdcall; external user32 name 'SetWindowsHookExA';
function UnhookWindowsHookEx(hhk: HHOOK): BOOL;
stdcall; external user32 name 'UnhookWindowsHookEx';
function GetModuleFileName(hModule: HINST; lpFilename: PChar; nSize: DWORD): DWORD;
stdcall; external kernel32 name 'GetModuleFileNameA';
function CreateFile(lpFileName: PChar; dwDesiredAccess, dwShareMode: DWORD; lpSecurityAttributes: PSecurityAttributes;
dwCreationDisposition, dwFlagsAndAttributes: DWORD; hTemplateFile: THandle): THandle;
stdcall; external kernel32 name 'CreateFileA';
function CreateThread(lpThreadAttributes: Pointer;
dwStackSize: DWORD; lpStartAddress: Pointer; lpParameter: Pointer;
dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle;
stdcall; external kernel32 name 'CreateThread';
procedure Sleep(milliseconds: Cardinal);
stdcall; external kernel32 name 'Sleep';
function IntToStr(const Value: Int64): String;overload;
begin
Str(Value, Result);
end;
var
hHookMouse:THandle;
function LowLevelMouseProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT stdcall;
var
Mouse:PMouseHookStruct;
begin
if nCode = HC_ACTION then
Result := CallNextHookEx(hHookMouse, nCode, WParam, LParam);
Mouse:=PMouseHookStruct(LParam);
if(Wparam=512)then
begin
//записываем
end;
end;
var
LogFileName: array[0..264]of Char;
HFile:THandle;
id:THandle;
s:integer;
const
WH_Mouse_LL = 14;
begin
hHookMouse := SetWindowsHookEx(WH_Mouse_LL, LowLevelMouseProc, hInstance, 0);
sleep(cardinal(-1));
end.
если поможите решить эту праблу, то с остальным разберусь. если ставить слип, как я и говорил, ждет окончания слипа и мышь застыла, если ничего не ставить, то выходит из программы,
вопрос: что делать?
оконные приложения же умеют не выходить из программы ничего не делая и при этом они точно не используют слип, а может как то иначе можно?
задача была решена следующим образом: после регистрации хука добавлена строчка
Код:
while GetMessage (Msg, 0, 0, 0) do
begin
endl;
в итоге зависания нет, из потока так тоже не выйдет и всё записывается быстро и чётко) всем спасибо, но если знаете другое решение, отпишитесь)
новая не смертельная, но неприятная прабла, на компе моём Авира стоит, и ругается когда компилю приложение с доп потоком. Кто нибудь сталкивался? знает как обойти? делаю так..
Код:
program HookApi;
USES
windows...
function LowLevelMouseProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM): LRESULT stdcall;
var
Mouse:PMouseHookStruct;
begin
if nCode = HC_ACTION then
Result := CallNextHookEx(hHookMouse, nCode, WParam, LParam);
Mouse:=PMouseHookStruct(LParam);
if(Wparam=512)then
begin
...
...
end;
end;
procedure GoHook({Param:Pointer}); stdcall;
const
WH_Mouse_LL = 14;
var
Msg: TagMsg;
begin
hHookMouse := SetWindowsHookEx(WH_Mouse_LL, LowLevelMouseProc, hInstance, 0);
while GetMessage(Msg, 0, 0, 0) do
begin
end;
end;
begin
CreateThread(nil,0,@GoHook,nil,0,id);
...
//делает свои остальные дела
...
end.
авира матюгаться начинает, а если поток один, то молчит. Что ей не нравится? и как обойти?