Содержание материала

 

Code:

library keyboardhook;

 

uses

SysUtils,

Windows,

Messages,

Forms;

 

const

MMFName:PChar='Keys';

 

type

PGlobalDLLData=^TGlobalDLLData;

TGlobalDLLData=packed record

SysHook:HWND; //дескриптор установленной ловушки

MyAppWnd:HWND; //дескриптор нашего приложения

end;

 

var

GlobalData:PGlobalDLLData;

MMFHandle:THandle;

WM_MYKEYHOOK:Cardinal;

 

function KeyboardProc(code:integer;wParam:word;lParam:longint):longint;stdcall;

var

AppWnd:HWND;

begin

if code < 0 then

begin

Result:=CallNextHookEx(GlobalData^.SysHook,Code,wParam,lParam);

Exit;

end;

if (((lParam and KF_UP)=0)and

(wParam>=0)and(wParam<=255))OR {поставь от 65 до 90, если тебе}

(((lParam and KF_UP)=0)and {нужны только A..Z}

(wParam=VK_SPACE))then

begin

AppWnd:=GetForegroundWindow();

SendMessage(GlobalData^.MyAppWnd,WM_MYKEYHOOK,wParam,AppWnd);

end;

CallNextHookEx(GlobalData^.SysHook,Code,wParam,lParam);

Result:= 0;

end;

 

{Процедура установки HOOK-а}

procedure hook(switch : Boolean; hMainProg: HWND) export; stdcall;

begin

if switch=true then

begin

{Устанавливаем HOOK, если не установлен (switch=true). }

GlobalData^.SysHook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, HInstance, 0);

GlobalData^.MyAppWnd:= hMainProg;

end

else

UnhookWindowsHookEx(GlobalData^.SysHook)

end;

 

procedure OpenGlobalData();

begin

{регестрируем свой тип сообщения в системе}

WM_MYKEYHOOK:= RegisterWindowMessage('WM_MYKEYHOOK');

{полу?аем объект файлового отображения}

MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE,0,SizeOf(TGlobalDLLData),MMFName);

{отображаем глобальные данные на АП вызывающего процесса и полу?аем указатель

на на?ало выделенного пространства}

GlobalData:= MapViewOfFile(MMFHandle,FILE_MAP_ALL_ACCESS,0,0,SizeOf(TGlobalDLLData));

if GlobalData=nil then

begin

CloseHandle(MMFHandle);

Exit;

end;

 

end;

 

procedure CloseGlobalData();

begin

UnmapViewOfFile(GlobalData);

CloseHandle(MMFHandle);

end;

 

procedure DLLEntryPoint(dwReason: DWord); stdcall;

begin

case dwReason of

DLL_PROCESS_ATTACH: OpenGlobalData;

DLL_PROCESS_DETACH: CloseGlobalData;

end;

end;

 

exports

hook;

 

begin

DLLProc:= @DLLEntryPoint;

{вызываем назна?енную процедуру для отражения факта присоединения данной

библиотеки к процессу}

DLLEntryPoint(DLL_PROCESS_ATTACH);

end.

 

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить