Форум: "Начинающим";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];
ВнизHookи Найти похожие ветки
← →
Человек (2006-02-06 11:06) [0]Расскажите, пожалуйста, как писать различные хуки(как реализовать?), и вообще какие хуки вы знаете. А то я смотрю на сделанную кем-то программу и, вроде, все понимаю, а свою вряд ли напишу. Можно послать меня по какой-нибудь ссылке (только по теме :))
← →
kaZaNoVa © (2006-02-06 11:21) [1]
// Example3; //
// @Aleksey Pavlov //
// Demo of WH_KEYBOARD hook - DLL module //
library keyhook;
uses
// SysUtils,
Windows,
Messages//, Forms
;
const
MMFName: PChar = "KeyMMF454545454"; // имя объекта файлового отображения
{структура, поля которой будут отображены в файл подкачки}
type
PGlobalDLLData = ^TGlobalDLLData;
TGlobalDLLData = packed record
SysHook: HWND; // дескриптор установленной ловушки
MyAppWnd: HWND; // дескриптор нашего приложения
end;
type
PKeybdHookStruct = ^TKeybdHookStruct;
TKeybdHookStruct = record
vkCode: DWORD;
scanCode: DWORD;
flags: DWORD;
time: DWORD;
dwExtraInfo: PULONG;
end;
var
GlobalData: PGlobalDLLData;
MMFHandle: THandle;
WM_MYKEYHOOK: Cardinal;
function KeyboardProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
const
CAltSet : set of byte = [164,165];
CCtrlSet : set of byte = [162,163];
CDelSet : set of byte = [46,110];
var
MMFHandle: THandle;
Kill: boolean;
BlockSet: Set Of byte;
lHkStruct: PKeybdHookStruct;
lPressedCount: integer;
AppWnd: HWND; // дескриптор приложения, в котором произошло нажатие клавишы
begin
if (Code < 0) or (wParam = PM_NOREMOVE) then
begin
Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
Exit;
end;
{ if ( ((lParam and KF_UP)=0) and (wParam>=65) and (wParam<=90) ) OR ( ((lParam and KF_UP)=0) and (wParam=VK_SPACE) )
then
begin }
AppWnd:= GetForegroundWindow();
SendMessage(GlobalData^.MyAppWnd, WM_MYKEYHOOK, wParam, AppWnd);
{можно и так, что бы не сохранять дескриптор главного приложения}
//SendMessage(HWND_BROADCAST, WM_MYKEYHOOK, wParam, AppWnd);
// end;
if Code = HC_ACTION then
begin
Kill := False;
lHkStruct := Pointer(lParam);
BlockSet := [];
if {LockWIN}True then
BlockSet := BlockSet + [91,92];
if {LockCaps}True then
BlockSet := BlockSet + [20];
KILL := lHkStruct^.vkCode in BlockSet;
if kill then
result := 1
else
begin CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
result:=0; end;
end;
end;
{Процедура установки HOOK-а}
procedure hook(switch : Boolean; hMainProg: HWND) export; stdcall;
begin
if switch=true then
begin
{Устанавливаю HOOK, если он не установлен (switch=true). }
GlobalData^.SysHook := SetWindowsHookEx(13{WH_KEYBOARD}, @KeyboardProc, HInstance, 0);
GlobalData^.MyAppWnd:= hMainProg;
if GlobalData^.SysHook <> 0 then
MessageBox(0, "KEYBOARD HOOK установлен !", "Message from keyhook.dll", 0)
else
MessageBox(0, "HOOK установить не удалось !", "Message from keyhook.dll", 0);
end
else
begin
{Удаляю функцию-фильтр, если она установлена (т.е. switch=false). }
if UnhookWindowsHookEx(GlobalData^.SysHook) then
MessageBox(0, "HOOK снят !", "Message from keyhook.dll", 0)
else
MessageBox(0, "HOOK снять не удалось !", "Message from keyhook.dll", 0);
end;
end;
procedure OpenGlobalData();
begin
{регестрируем свой тип сообщения в системе}
WM_MYKEYHOOK:= RegisterWindowMessage("WM_MYKEYHOOK");
{получаем объект файлового отображения}
// MMFHandle:= CreateFileMapping(DWord(-1), nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName); // можно так, но лучше: см. след. строку
MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
if MMFHandle = 0 then
begin
MessageBox(0, "Can""t create FileMapping", "Message from keyhook.dll", 0);
Exit;
end;
{отображаем глобальные данные на АП вызывающего процесса и получаем указатель
на начало выделенного пространства}
GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
if GlobalData = nil then
begin
CloseHandle(MMFHandle);
MessageBox(0, "Can""t make MapViewOfFile", "Message from keyhook.dll", 0);
Exit;
end;
end;
procedure CloseGlobalData();
begin
UnmapViewOfFile(GlobalData);
CloseHandle(MMFHandle);
MessageBox(0,"5","0",0);
end;
procedure DLLEntryPoint(dwReason: DWord); stdcall;
begin
case dwReason of
DLL_PROCESS_ATTACH: OpenGlobalData;
DLL_PROCESS_DETACH: CloseGlobalData;
end;
end;
exports hook;
begin
//MessageBox(0, PChar(Application.ExeName), "Message from keyhook.dll", 0);
{назначим поцедуру переменной DLLProc}
DLLProc:= @DLLEntryPoint;
{вызываем назначенную процедуру для отражения факта присоединения данной
библиотеки к процессу}
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
← →
ZeroDivide © (2006-02-06 12:20) [2]НООК - это механизм перехвата сообщений, предоставляемый системой Microsoft Windows. Программист пишет специального вида функцию (НООК-функция), которая затем при помощи функции SetWindowsHookEx вставляется на верх стека НООК-функций системы. Ваша НООК-функция сама решает, передать ли ей сообщение в следующую НООК-функцию при помощи CallNextHookEx или нет.
НООК бывают глобальные, контролирующие всю систему, так и локальные, ориентированные на какой-либо поток (Thread). Кроме того НООК различаются по типу перехватываемых сообщений.
НООК удаляется при помощи функции UnHookWindowsEx.
Более подробно смотри справку по этим функциям
PS: Локальные хуки не обязательно оформлять в виде dll.
← →
Fay © (2006-02-07 03:44) [3]2 [1] kaZaNoVa © (06.02.06 11:21)
1) Можно было просто дать ссылку на статью, благо она (была, как минимум) на этом же сервере.
2)
>function KeyboardProc(code : integer; wParam : word; lParam : longint)
Почему WORD, а не _SYSTEMTIME( к примеру)?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.039 c