Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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
4-92296
tiam
2003-06-26 08:12
2003.08.28
Состояние чужого процесса


7-92271
Aleksei
2003-06-15 12:39
2003.08.28
Как создать ярлык на Desktop


4-92307
artist
2003-06-25 16:35
2003.08.28
pressed всегда истина хотя на самом деле нет. Почему?


14-92212
clickmaker
2003-08-11 16:50
2003.08.28
Устоявшийся мужчина


7-92285
Федя
2003-06-10 15:48
2003.08.28
Не работает ExitWindowsEx(EWX_FORCE+EWX_REBOOT,0)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский