Текущий архив: 2007.01.07;
Скачать: CL | DM;
Вниз
Как отловить нажатия клавиш для всех процессов!? Найти похожие ветки
← →
Вуук (2006-08-21 01:27) [0]Подскажиту пожалуйста!
← →
Мичман Панин (2006-08-21 01:46) [1]Даже в военное время не все процессы требуют нажатия клавиш.
← →
Vendict © (2006-08-21 12:03) [2]Вуук (21.08.06 1:27)
может hook ? всмысле ловушкой ?
тогда так.
создаешь файлик "keyboard.dpr" такого содержания:library keyboard;
uses Windows, Messages;
var
SysHook : HHook = 0;
Wnd : Hwnd = 0;
function SysMsgProc(code : integer; wParam : word;
lParam : longint) : longint; stdcall;
Var
key:array [0..16] of Char;
h:HWND;
f:TextFile;
begin
if lParam<>16777217 then
//Передать сообщение другим ловушкам в системе
// если не сделать этого, система зависнет
Result := CallNextHookEx(SysHook, Code, wParam, lParam);
//Проверяю сообщение
if (code = HC_ACTION) then
begin
GetKeyNameText(lParam,Key,SizeOf(Key));
// в key находится название клавиши
If key="Prnt Scrn" then
begin
h:=FindWindow("TForm1","Моя форма");
SendMessage(h,$0505,0,0);
//а это мы посылаем сообщение форме что была нажата клавиша
//форма должна быть класса TForm1 и иметь Caption="Моя форма"
end;
end;
end;
// Процедура запуска.
procedure RunStopHook(State : Boolean) export; stdcall;
begin
//Если State = true, то ...
if State=true then
begin
//Запускаем ловушку.
SysHook := SetWindowsHookEx(WH_KEYBOARD,
@SysMsgProc, HInstance, 0);
end
else//Иначе
begin
//Отключить ловушку.
UnhookWindowsHookEx(SysHook);
SysHook := 0;
end;
end;
exports RunStopHook index 1;
end.
и к этому нужно приложение, устанавливающее ловушку и обрабатывающее сообщение:
"main.pas":unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure Mes(var Mes:TMessage); message MS;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
procedure RunStopHook(State : Boolean)
stdcall; external "keyboard.dll" index 1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
RunStopHook(true);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
RunStopHook(false);
end;
procedure TForm1.Mes;
begin
//здесь как-то реагируешь на полученое сообщение
End;
end.
вроде бы всё...
← →
Vendict © (2006-08-21 12:06) [3]Vendict © (21.08.06 12:03) [2]
вроде бы всё...
не всё. забыл. там ещё нужно добавить пару строчек перед "type" в "main.pas":const
MS=$0505;
← →
Пусик © (2006-08-21 12:11) [4]http://delphimaster.net/view/1-1155502154/
← →
Пусик © (2006-08-21 12:19) [5]PS.
В данном случае хук не обязательно должен использовать DLL.
← →
Vendict © (2006-08-21 12:36) [6]Пусик © (21.08.06 12:11) [4]
Пусик © (21.08.06 12:19) [5]
Я это писал год назад. просто привел свой код, как делал я.
и по-моему понятнее, чем там.
← →
Пусик © (2006-08-21 12:50) [7]
> Vendict © (21.08.06 12:36) [6]
О чем спич?
Здесь никто ничем не меряется. Приводятся варианты решения.
← →
Rouse_ © (2006-08-21 13:36) [8]
> Пусик © (21.08.06 12:19) [5]
> PS.
> В данном случае хук не обязательно должен использовать DLL.
>
LowLevelHook только в 2000-ом появились, так что если нужно для всех ОС, то только через библиотеку :)
← →
apic © (2006-08-21 14:31) [9]http://www.delphimaster.ru/articles/hooks/index.html
← →
apic © (2006-08-21 14:31) [10]http://www.delphimaster.ru/articles/hooks/index.html
← →
GrayFace © (2006-08-25 21:55) [11]Rouse_ © (21.08.06 13:36) [8]
LowLevelHook только в 2000-ом появились, так что если нужно для всех ОС, то только через библиотеку :)
JournalRecord был и раньше, если мне запоменающее устройство в мозгу не изменяет.
← →
Орион © (2006-08-26 20:18) [12]> Как отловить нажатия клавиш для всех процессов!?
Дай угадаю: следующий вопрос будет, как перехватить нажатие Ctrl+Alt+Del?)))
Страницы: 1 вся ветка
Текущий архив: 2007.01.07;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.008 c