Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как отловить нажатия клавиш для всех процессов!?


Вуук ©   (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]

Даже в военное время не все процессы требуют нажатия клавиш.


Наверх

Титульная страница Поиск, карта сайта Написать письмо