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.
Реализация Hook-a
Вот только не до конца понял как получить непосредственно код нажатой клавиши...
DLL-ка:
Код:
Прога:
Код:
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.
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.
вобщем тут конечно же только реализована сама длл-ка и ее загрузка в проге, а дальше (как получить код клавиши в какуюнибудь переменную) я что то не понимаю...
ну подскажите может кто знает как перекрыть сообщение кавиши?
например: нажимаем кнопку "MustDie" и что б происходило мае событие а не вылет менюшки...
Цитата: Maniak
видимо вопросик трудноватый...
ну подскажите может кто знает как перекрыть сообщение кавиши?
например: нажимаем кнопку "MustDie" и что б происходило мае событие а не вылет менюшки...
ну подскажите может кто знает как перекрыть сообщение кавиши?
например: нажимаем кнопку "MustDie" и что б происходило мае событие а не вылет менюшки...
Очень просто, возвращать не нулевое значение при выходе из ф-ции.
а на пальцах можна?... из какой функции?
Цитата: Maniak
а на пальцах можна?... из какой функции?
В делфи я не силен и синтаксис понимаю струдом. Вышесказанное надо производить в ф-ции перехвата.