Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

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

Как правильно перехватывать нажатия на клаву во ВСЕХ приложениях?
Как перехватить нажатие, изменить значение на нужное и послать дальше винде (переназначить)?
CODeRUS вне форума Ответить с цитированием
Старый 25.07.2007, 12:45   #2
Rouse_
Пользователь
 
Аватар для Rouse_
 
Регистрация: 31.05.2007
Сообщений: 56
По умолчанию

Код:
 
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  end;
 
var
  Form1: TForm1;
 
implementation
 
var
  hHook: THandle;
 
{$R *.dfm}
 
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 = 'Keyboard message = %s ';
  RPT_LPARAM_DATA = 'scan code = %s [%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_KEYDOWN']);
    WM_KEYUP: StrResult := Format(RPT_WPARAM_DATA, ['WM_KEYUP']);
    WM_SYSKEYDOWN: StrResult := Format(RPT_WPARAM_DATA, ['WM_SYSKEYDOWN']);
    WM_SYSKEYUP: StrResult := Format(RPT_WPARAM_DATA, ['WM_SYSKEYUP']);
  end;
  StrResult := StrResult + Format(RPT_LPARAM_DATA, [
    Chr(PKbdDllHookStrukt(LParam)^.vkCode), PKbdDllHookStrukt(LParam)^.vkCode]);
  Form1.Memo1.Lines.Add(StrResult);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
const
  WH_KEYBOARD_LL = 13;
begin
  hHook := SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);
  if hHook = 0 then RaiseLastOSError;
end;
 
procedure TForm1.FormDestroy(Sender: TObject);
begin
  if not UnhookWindowsHookEx(hHook) then RaiseLastOSError;
end;
 
end.
Vae Victis
(Горе побежденным (лат.))
Демки с открытым кодом:
http://rouse.drkb.ru
Rouse_ вне форума Ответить с цитированием
Старый 25.07.2007, 12:53   #3
CODeRUS
 
Регистрация: 25.07.2007
Сообщений: 4
По умолчанию

Спасибо, оч интересно, но как быть с не буквенно-цифровыми клавишами?
И как переделать код, чтобв передавал только цифровой код, или только ASCII?

Последний раз редактировалось CODeRUS; 25.07.2007 в 13:15. Причина: Добавление
CODeRUS вне форума Ответить с цитированием
Старый 26.07.2007, 11:42   #4
CODeRUS
 
Регистрация: 25.07.2007
Сообщений: 4
По умолчанию

Переделал таки я код, чтобы выдавался только цифровой код в переменную.. А как теперь его сконвертировать в название клавиши?
CODeRUS вне форума Ответить с цитированием
Старый 26.07.2007, 20:11   #5
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

функция chr конвертирует число типа integer в символ char
пример
Код:
var
  s:shar;
s:=chr(65);
после чего s будет иметь значение 'A'

функция ord конвертирует символ char в число типа integer
пример
Код:
var
  с:integer;
с:=ord('A');
после чего с будет иметь значение 65

Последний раз редактировалось rpy3uH; 26.07.2007 в 20:15.
rpy3uH вне форума Ответить с цитированием
Старый 27.07.2007, 10:37   #6
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Или может ToAscii/ToAsciiEx тогда не будет проблем с перхваченным русским текстом, djn nfrb[, если конечно это для кейлоггера

http://msdn2.microsoft.com/en-us/library/ms646316.aspx
пыщь
JTG вне форума Ответить с цитированием
Старый 27.07.2007, 19:08   #7
CODeRUS
 
Регистрация: 25.07.2007
Сообщений: 4
По умолчанию

А как быть с функц клавишами?
CODeRUS вне форума Ответить с цитированием
Старый 06.07.2009, 10:25   #8
YoraG
Пользователь
 
Регистрация: 06.11.2008
Сообщений: 10
Радость Спасибо

Весьма благодарен за исходник, очень долго искал, а тут вот те на - работает код
YoraG вне форума Ответить с цитированием
Старый 06.07.2009, 11:08   #9
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Рекомендую почитать вот это. Там есть исходник кейлоггера.
rpy3uH вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перехват клавиатуры Ferro Общие вопросы Delphi 3 25.03.2010 21:02
обраьотка событий Geddar PHP 5 04.07.2008 23:53
обработчик событий ben95 Помощь студентам 5 28.01.2008 17:46
Ловля событий (hooks) Domoffou Win Api 1 06.01.2008 15:48
создание журнала событий alshab Общие вопросы Delphi 3 20.05.2007 17:03