Показать сообщение отдельно
  #9  
Старый 13.03.2014, 13:05
reqyz reqyz вне форума
Начинающий
 
Регистрация: 13.02.2010
Сообщения: 104
Репутация: 10
По умолчанию

Код:
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.

авира матюгаться начинает, а если поток один, то молчит. Что ей не нравится? и как обойти?
Ответить с цитированием