Форум: "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.044 c