Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Реализация Hook-a

347
23 декабря 2007 года
Maniak
319 / / 05.11.2005
Народ помогите с длл-кой...Вот пишу прогу которая ставит хук на клаву ну и патом в соответствии с определенной комбинацией клавиш что то делает (винампом там управляет и т.д.)
Вот только не до конца понял как получить непосредственно код нажатой клавиши...
DLL-ка:
Код:
library Meneger_dll;
uses SysUtils, Classes, Windows, Messages;

const
KeyEvent=WM_USER+1;
WinTitle='Key_Meneger';

var HookHandle: HHOOK;

function KeyHook(code: integer; WParam: word; lParam: Longint):Longint;stdcall;
var Wnd: hWnd;
begin
if (code=HC_ACTION) and (lParam <> lParam or $8000 shl 16) and (lParam <> lParam or $8000 shl 15) then
begin
    Wnd:=FindWindow(WinTitle, nil);
    SendMessage(Wnd, KeyEvent, wParam, lParam);
end;
Result:=CallNextHookEx(HookHandle, code, WParam, lParam);
end;

procedure SetKeyHook; export;
begin
HookHandle:=SetWindowsHookEx(WH_KEYBOARD, @KeyHook, hInstance, 0);
end;

procedure DelKeyHook; export;
begin
if HookHandle <> 0 then UnhookWindowsHookEx(HookHandle);
HookHandle:=0;
end;

exports
SetKeyHook name 'SetKeyHook',
DelKeyHook name 'DelKeyHook';

begin
end.

Прога:
Код:
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

const
KeyEvent=WM_USER+1;
DllName='Meneger_dll';

type
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  procedure WM_new(var M: TMessage);
  message KeyEvent;
  public
    { Public declarations }
  end;

var Form1: TForm1;
     P:Pointer;
     hLib:THandle;

implementation

{$R *.dfm}

function SetKeyHook: Longint; external DllName name 'SetKeyHook';
function DelKeyHook: Longint; external DllName name 'DelKeyHook';

procedure Tform1.WM_new(var M: TMessage);  //это я сам не знаю что написал - выдрал с какого-то примера
begin
Label1.Caption:='NEW';
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
hLib:=LoadLibrary(DllName);
SetKeyHook;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
FreeLibrary(hLib);
DelKeyHook;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FreeLibrary(hLib);
DelKeyHook;
end;

end.

вобщем тут конечно же только реализована сама длл-ка и ее загрузка в проге, а дальше (как получить код клавиши в какуюнибудь переменную) я что то не понимаю...
347
25 декабря 2007 года
Maniak
319 / / 05.11.2005
видимо вопросик трудноватый...
ну подскажите может кто знает как перекрыть сообщение кавиши?
например: нажимаем кнопку "MustDie" и что б происходило мае событие а не вылет менюшки...
370
25 декабря 2007 года
koval
443 / / 29.08.2005
Цитата: Maniak
видимо вопросик трудноватый...
ну подскажите может кто знает как перекрыть сообщение кавиши?
например: нажимаем кнопку "MustDie" и что б происходило мае событие а не вылет менюшки...



Очень просто, возвращать не нулевое значение при выходе из ф-ции.

347
25 декабря 2007 года
Maniak
319 / / 05.11.2005
а на пальцах можна?... из какой функции?
370
26 декабря 2007 года
koval
443 / / 29.08.2005
Цитата: Maniak
а на пальцах можна?... из какой функции?



В делфи я не силен и синтаксис понимаю струдом. Вышесказанное надо производить в ф-ции перехвата.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог