Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.28;
Скачать: CL | DM;

Вниз

Несколько 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.019 c
3-92063
syte_ser78
2003-08-02 12:17
2003.08.28
связь treeview и таблицы


7-92290
Voron1
2003-06-14 19:53
2003.08.28
Как узнать из программы, в какую папку установлена Windows?


4-92316
Fdu4
2003-06-24 21:11
2003.08.28
подмена параметров в CallNextHookEx


3-92040
AM$
2003-08-06 10:28
2003.08.28
Вопрос по Database Desktop


4-92306
Pavel74
2003-06-28 17:33
2003.08.28
Kак открыть файлы в свое приложение как это делает winamp?