![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как отловить нажатия клавиш для всех процессов!?
Вуук © (2006-08-21 01:27:00)Подскажиту пожалуйста!
Орион (2006-08-26 20:18:00) [1]> Как отловить нажатия клавиш для всех процессов!?
Дай угадаю: следующий вопрос будет, как перехватить нажатие Ctrl+Alt+Del?)))
GrayFace (2006-08-25 21:55:00) [2]Rouse_ © (21.08.06 13:36) [8]
LowLevelHook только в 2000-ом появились, так что если нужно для всех ОС, то только через библиотеку :)
JournalRecord был и раньше, если мне запоменающее устройство в мозгу не изменяет.
apic (2006-08-21 14:31:00) [3]http://www.delphimaster.ru/articles/hooks/index.html
apic (2006-08-21 14:31:00) [4]http://www.delphimaster.ru/articles/hooks/index.html
Rouse_ (2006-08-21 13:36:00) [5]
> Пусик © (21.08.06 12:19) [5]
> PS.
> В данном случае хук не обязательно должен использовать DLL.
>
LowLevelHook только в 2000-ом появились, так что если нужно для всех ОС, то только через библиотеку :)
Пусик (2006-08-21 12:50:00) [6]
> Vendict © (21.08.06 12:36) [6]
О чем спич?
Здесь никто ничем не меряется. Приводятся варианты решения.
Vendict (2006-08-21 12:36:00) [7]Пусик © (21.08.06 12:11) [4]
Пусик © (21.08.06 12:19) [5]
Я это писал год назад. просто привел свой код, как делал я.
и по-моему понятнее, чем там.
Пусик (2006-08-21 12:19:00) [8]PS.
В данном случае хук не обязательно должен использовать DLL.
Пусик (2006-08-21 12:11:00) [9]http://www.delphimaster.ru/cgi-bin/forum.pl?id=1155502154&n=0
Vendict (2006-08-21 12:06:00) [10]Vendict © (21.08.06 12:03) [2]
вроде бы всё...
не всё. забыл. там ещё нужно добавить пару строчек перед "type" в "main.pas":
const
MS=$0505;
Vendict (2006-08-21 12:03:00) [11]Вуук (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.
вроде бы всё...
Мичман Панин (2006-08-21 01:46:00) [12]Даже в военное время не все процессы требуют нажатия клавиш.