Главная страница
    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
14-92215
mOOx_
2003-08-10 13:53
2003.08.28
PChar по сети


9-91967
Andy Eremin
2003-02-27 07:35
2003.08.28
определение расстояния до объекта


7-92269
Oalien
2003-06-14 17:52
2003.08.28
пароль на папку


9-91965
Armageddon
2003-02-13 21:27
2003.08.28
Как использовать модели созданные в 3ds Max.


1-92108
still
2003-08-14 19:36
2003.08.28
Стандартное PopupMenu у TCustomEdit





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский