Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.27;
Скачать: CL | DM;

Вниз

Помогите с клавиатурным Хуком!   Найти похожие ветки 

 
fafCracker   (2005-01-16 13:01) [0]

Я схватил за хвост сообщение о нажатии клавиши "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:44) [1]

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

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


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

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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2005.02.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.051 c
1-1108105435
Zloy
2005-02-11 10:03
2005.02.27
Удаление иконки с трея


4-1105510712
DmiSb
2005-01-12 09:18
2005.02.27
О прорисовке на битмапе


1-1108457263
speed
2005-02-15 11:47
2005.02.27
Hint...


4-1105775167
Atrion
2005-01-15 10:46
2005.02.27
Поскажите по отлову message от TreeView


10-1084008974
ivs
2004-05-08 13:36
2005.02.27
Передача массива данных