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.
|