Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.035 c
1-1108144299
Gear
2005-02-11 20:51
2005.02.27
Как правильно удалить родной Indy из Delphi 7?


6-1103612709
VAleksey
2004-12-21 10:05
2005.02.27
WinInet. Проблемы с HttpSendRequest.


1-1107877962
_student
2005-02-08 18:52
2005.02.27
Как работать с Compound Document (он же OLE Structured Storage).


1-1108385585
ST
2005-02-14 15:53
2005.02.27
Сервисы


1-1107985024
Homa_Programer
2005-02-10 00:37
2005.02.27
Разделитель дробной части





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский