Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с клавиатурным Хуком! [D5, WinXP]


fafCracker ©   (2005-01-16 13:01:00) 

Я схватил за хвост сообщение о нажатии клавиши "S" на клавиатуре. Ну то есть с помощью библиотеки "hackpass.dll" поймал сообщение о ее нажатии. Но мне этого мало. Надо, чтобы перехваченное сообщение умирало, то есть как будто клавиша "S" вообще не нажималась. Например при работе с блокнотом при нажатии на клавишу "S" ничего не писалось (в блокнот не приходило сообщение). Привожу текст библиотеки и юнита. Кто может - допишите пару строчек в библиотеку.

//Это листинг библиотеки перехвата
library hackpass;

uses //Windows, Messages;
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
var
SysHook : HHook = 0;
Wnd : Hwnd = 0;

function SysMsgProc(code : integer; wParam : word;
lParam : longint) : longint; stdcall;
begin
// Передать сообщение другим ловушкам в системе
CallNextHookEx(SysHook, Code, wParam, lParam);
// Проверяю сообщение
if code = HC_ACTION then
begin
  // Получаю идентификатор окна сгенерировавшего сообщение
  Wnd := TMsg(Pointer(lParam)^).hwnd;

  //ffo Если кликнули правой кнопкой
  // if TMsg(Pointer(lParam)^).message = WM_RBUTTONDOWN then ShowMessage('Щелчок правой');  //Работает

  //Если крутили среднюю
  //  if TMsg(Pointer(lParam)^).message = wm_MOUSEWHEEL then ShowMessage('Крутнул среднюю'); //Работает

 //Перехват нажатия конкретной клавиши на клавиатуре
  if TMsg(Pointer(lParam)^).message =WM_KEYDOWN then  //Работает
  case (TMsg(Pointer(lParam)^).wParam) of

//Нашел этот пример и исковырял его под свои нужды перехвата мыши и клавы.
//Берите кому надо - работает отлично. Да вот проблемку не могу решить.

  //Вот тут надо чтоб не ShowMessage выдавалось, а пойманное сообщение
  //умирало (убить его надо, чтоб оно дальше не пошло).
  //К примеру при моей запущенной проге в блокноте не будет писаться буква "S".
  //Утрирую конечно, но это чтоб понятно было чего хочу добиться.
  //Тут 83 - это цифровой идентификатор буквы  "S" на клаве.

    83:     ShowMessage('Нажали клавишу "S"  на клавиатуре');end;

     //84:  ShowMessage('Нажали клавишу "T"  на клавиатуре');
    //85:  ShowMessage('Нажали клавишу "T"  на клавиатуре');
    //86:  ShowMessage('Нажали клавишу "U"  на клавиатуре');
    //87:  ShowMessage('Нажали клавишу "V"  на клавиатуре');
    //88:  ShowMessage('Нажали клавишу "W"  на клавиатуре');
    //89:  ShowMessage('Нажали клавишу "X"  на клавиатуре');
    //90:  ShowMessage('Нажали клавишу "Z"  на клавиатуре');
    end;//case
end;
end;

// Процедура запуска.
procedure RunStopHook(State : Boolean) export; stdcall;
begin
// Если State = true, то...
if State=true then
begin
  // Запускаем ловушку.
  SysHook := SetWindowsHookEx(WH_GETMESSAGE,
     @SysMsgProc, HInstance, 0);
end
else// Иначе
begin
  // Отключить ловушку.
  UnhookWindowsHookEx(SysHook);
  SysHook := 0;
end;
end;

exports RunStopHook index 1;

begin
end.

Unit1
//Это листинг Юнита, который использует эту библиотеку
uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
 TForm1 = class(TForm)
   procedure FormShow(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 procedure RunStopHook(State : Boolean) stdcall; external 'hackpass.dll' index 1;
implementation

{$R *.DFM}

procedure TForm1.FormShow(Sender: TObject);
begin
RunStopHook(true);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
RunStopHook(false);
end;

end.


Sumor   (2005-01-16 14:58:00) [1]

Значит поменяй на сообщение WM_MOUSEMOVE не передвигая мышку, WM_PAINT c пустой областью и тд. Ну можно же придумать. Можно даже просто заменить клавишу S на какую-нибудь другую, несуществующую.


Kerk   (2005-01-16 14:46:00) [2]

Sumor   (16.01.05 14:44) [1]
TMsg(Pointer(lParam)^).message := 100000;

этого делать нельзя!!! никто не знает какие сообщения стороняя прога обрабатывает.


Sumor   (2005-01-16 14:44:00) [3]

Вроде бы ты не можешь удалить сообщение из очереди, но ты его можешь изменить как тебе захочется. Например, ты можешь изменить сообщение WM_KEYDOWN на другое, которое не обрабатывается окном:

TMsg(Pointer(lParam)^).message := 100000;
После этого буква s не дойдёт до адресата.


Наверх

Титульная страница Поиск, карта сайта Написать письмо