Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Delphi | Помогите с клавиатурным Хуком! (http://forum.oszone.net/showthread.php?t=43885)

SASHA 333 16-01-2005 13:16 289027

Delphi | Помогите с клавиатурным Хуком!
 
Delphi5 WinXP
Я схватил за хвост сообщение о нажатии клавиши "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.


Savant 16-01-2005 16:05 289068

Вложений: 1
SASHA 333
Гы, получилось. ЛОЛ получился... :lol: :lol: :lol: :lol: :lol:


Время: 12:32.

Время: 12:32.
© OSzone.net 2001-