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. |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!