![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Несколько hook-ов в одной dll
Mortal © (2003-06-14 13:14:00)
Воспользовался статьёй на этом сайте и написал 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.
Song (2003-06-15 16:02:00) [1]
Я про то, что call-back ф-ия хука, сделанная для WH_CBT, ну никак не работать, если её описать для хука WH_MOUSE. Оспорьте меня, DVM, Palladin ?
Palladin (2003-06-15 15:44:00) [2]
> Song © (15.06.03 13:33)
Что ты такое говоришь? Если прикалываешься то ставь смайл.
> Mortal © (15.06.03 10:08)
Что бы поставить еще один хуук опиши его процедуру да устанавливай точно также, кто тебе мешает, я не понимаю, в чем проблема то?
DVM (2003-06-15 15:35:00) [3]
> Song ©
> Одна длл - один хук.
Неправда. В одной dll может прекрасно уживаться несколько хуков. Зачем вводить людей в заблуждение?
Mortal (2003-06-15 14:16:00) [4]
xxxxxx
Mortal (2003-06-15 14:12:00) [5]
Sanks, Song.
Song (2003-06-15 13:33:00) [6]
Ну если ты поставил хук на WH_MOUSE, уж никак он на WH_GETMESSAGE работать не будет. Одна длл - один хук.
Mortal (2003-06-15 13:28:00) [7]
А почему?
Song (2003-06-15 13:06:00) [8]
И не получится.
Mortal (2003-06-15 10:08:00) [9]
Может кто-нибудь пример dll кинуть с несколькими хуками.
У меня не получается в эту dll второй хук вставить.
Заранее спасибо.
Palladin (2003-06-14 16:10:00) [10]
ну а в чем проблема?
такое чувство что ты просто код скопировал, а как это работает понятия не имеешь...