Форум: "Система";
Текущий архив: 2003.08.28;
Скачать: [xml.tar.bz2];
Вниз
Несколько hook-ов в одной dll Найти похожие ветки
← →
Mortal (2003-06-14 13:14) [0]Воспользовался статьёй на этом сайте и написал dll, которая отлавливает события мыши. Теперь надо добавить hook на WH_CBT, который будет отлавливать появления новых окон в Windows.
Помогите пожалуйста, а то я только начинаю изучать hook-и.
library mousehook;
uses
SysUtils,
Windows,
Messages,
Forms;
const
MMFName: PChar = "KeyMMF"; // имя объекта файлового отображения
{структура, поля которой будут отображены в файл подкачки}
type
PGlobalDLLData = ^TGlobalDLLData;
TGlobalDLLData = packed record
SysHook: HWND; // дескриптор установленной ловушки
MyAppWnd: HWND; // дескриптор нашего приложения
end;
var
GlobalData: PGlobalDLLData;
MMFHandle: THandle;
WM_YAMOUSEHOOK: Cardinal;
pmhs:PMouseHookStruct;
function MouseProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
if code < 0 then
begin
Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
Exit;
end;
If Code IN [HC_ACTION, HC_NOREMOVE] Then
Begin
//передаем информацию полученую хуком в главное приложение
pmhs:=PMouseHookStruct(LParam);
SendMessage(GlobalData^.MyAppWnd, WM_YAMOUSEHOOK, WParam, LParam);
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_MOUSE, @MouseProc, HInstance, 0);
GlobalData^.MyAppWnd:= hMainProg;
if GlobalData^.SysHook <> 0 then
MessageBox(0, "HOOK установлен !", "Message", 0)
else
MessageBox(0, "HOOK установить не удалось !", "Message", 0);
end
else
begin
{Удаляю функцию-фильтр, если она установлена (т.е. switch=false). }
if UnhookWindowsHookEx(GlobalData^.SysHook) then
MessageBox(0, "HOOK снят !", "Message", 0)
else
MessageBox(0, "HOOK снять не удалось !", "Message", 0);
end;
end;
procedure OpenGlobalData();
begin
{регестрируем свой тип сообщения в системе}
WM_YAMOUSEHOOK:= RegisterWindowMessage("WM_YAMOUSEHOOK");
{получаем объект файлового отображения}
// 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", 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", 0);
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
//MessageBox(0, PChar(Application.ExeName), "Message", 0);
{назначим поцедуру переменной DLLProc}
DLLProc:= @DLLEntryPoint;
{вызываем назначенную процедуру для отражения факта присоединения данной
библиотеки к процессу}
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
← →
Palladin (2003-06-14 16:10) [1]ну а в чем проблема?
такое чувство что ты просто код скопировал, а как это работает понятия не имеешь...
← →
Mortal (2003-06-15 10:08) [2]Может кто-нибудь пример dll кинуть с несколькими хуками.
У меня не получается в эту dll второй хук вставить.
Заранее спасибо.
← →
Song (2003-06-15 13:06) [3]И не получится.
← →
Mortal (2003-06-15 13:28) [4]А почему?
← →
Song (2003-06-15 13:33) [5]Ну если ты поставил хук на WH_MOUSE, уж никак он на WH_GETMESSAGE работать не будет. Одна длл - один хук.
← →
Mortal (2003-06-15 14:12) [6]Sanks, Song.
← →
Mortal (2003-06-15 14:16) [7]xxxxxx
← →
DVM (2003-06-15 15:35) [8]
> Song ©
> Одна длл - один хук.
Неправда. В одной dll может прекрасно уживаться несколько хуков. Зачем вводить людей в заблуждение?
← →
Palladin (2003-06-15 15:44) [9]
> Song © (15.06.03 13:33)
Что ты такое говоришь? Если прикалываешься то ставь смайл.
> Mortal © (15.06.03 10:08)
Что бы поставить еще один хуук опиши его процедуру да устанавливай точно также, кто тебе мешает, я не понимаю, в чем проблема то?
← →
Song (2003-06-15 16:02) [10]Я про то, что call-back ф-ия хука, сделанная для WH_CBT, ну никак не работать, если её описать для хука WH_MOUSE. Оспорьте меня, DVM, Palladin ?
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2003.08.28;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.006 c