Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите разобраться с хуками


Страницы:   1 2

RagE ©   (2004-06-04 16:29:00) 

Заранее благодарен.
Вот текст длл которую я использую.
// Example3;                               //
// @Aleksey Pavlov                        //
// Demo of WH_KEYBOARD hook - DLL module //

library Shell98;

uses
 SysUtils,
 Windows,
 Messages,
 Forms;

const
 MMFName: PChar = 'KeyMMF'; // имя объекта файлового отображения
 WM_SHELL = WM_USER + 200;

{структура, поля которой будут отображены в файл подкачки}
type
 PGlobalDLLData = ^TGlobalDLLData;
 TGlobalDLLData = packed record
   SysHook: HWND; // дескриптор установленной ловушки
   MyAppWnd: HWND; // дескриптор нашего приложения
 end;

var
 GlobalData: PGlobalDLLData;
 MMFHandle: THandle;
 WM_MYKEYHOOK: Cardinal;
 Counter:byte;

function KeyboardProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;

function GetShellWnd: THandle;
begin
Result:=FindWindow(nil, 'Калькулятор');
end;

begin
case Code of
HSHELL_WINDOWCREATED: if GetShellWnd=wParam then
 begin
//    sleep(100);
   postmessage(GetShellWnd,wm_close,0,0);
 end;
end;
Result:=CallNextHookEx(GlobalData^.SysHook, Code, WParam, LParam);
end;

{Процедура установки HOOK-а}
procedure hook(switch : Boolean; hMainProg: HWND) export; stdcall;
begin
 if switch=true then
 begin
   {Устанавливаю HOOK, если он не установлен (switch=true). }
   GlobalData^.SysHook := SetWindowsHookEx(WH_SHELL, @KeyboardProc, HInstance, 0);
   GlobalData^.MyAppWnd:= hMainProg;
   if GlobalData^.SysHook <> 0 then
//        MessageBox(0, 'KEYBOARD HOOK установлен !', 'Message from keyhook.dll', 0)
     else
       MessageBox(0, 'HOOK установить не удалось !', 'Message from keyhook.dll', 0);

 end
 else
 begin

   {Удаляю функцию-фильтр, если она установлена (т.е. switch=false). }
   if UnhookWindowsHookEx(GlobalData^.SysHook) then
//      MessageBox(0, 'HOOK снят !', 'Message from keyhook.dll', 0)
   else
     MessageBox(0, 'HOOK снять не удалось !', 'Message from keyhook.dll', 0);

 end;
end;

procedure OpenGlobalData();
begin
 {регестрируем свой тип сообщения в системе}
 WM_MYKEYHOOK:= RegisterWindowMessage('WM_MYKEYHOOK');

 {получаем объект файлового отображения}
//  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 from keyhook.dll', 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 from keyhook.dll', 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;

procedure inithook;
begin
 hook(true,0);
end;

procedure deinithook;
begin
 hook(false,0);
end;

exports hook;
exports inithook;
exports deinithook;

begin
Counter:=0;
//MessageBox(0, PChar(Application.ExeName), 'Message from keyhook.dll', 0);
 {назначим поцедуру переменной DLLProc}
 DLLProc:= @DLLEntryPoint;
 {вызываем назначенную процедуру для отражения факта присоединения данной
  библиотеки к процессу}
 DLLEntryPoint(DLL_PROCESS_ATTACH);
end.

Цель не дает запуститься калькулятору. Все работает только вот explorer постоянно недопустимые операции выполняет. Помогите плиз решить проблему

Есть еще аналогичная которая перехватывает нажатую клавишу. Там дела тоже плохо обстоят. ВЫлетают все приложения которые используют ввод с клавиатуры. В частности ICQ при отсылке сообщения


Sirgfine   (2004-06-09 04:56:00) [21]

Там много срезать надо! Правильно NS указывает. В итоге получится код с инициализацией (3-4 строчки), самим хуком (5 строчек), процедурой выгрузки (3 строчки), и... вроде всё больше ничего не надо


RagE   (2004-06-08 14:34:00) [22]

to NS
а в хуке для клавиатуры тоже самое только обработка чуток другая. Если нажата клавшиа то послать мессадж. Вобщем то стоит действительно попробовать убрать вызов DLLEntryPoint.
ЗЫ. код был не мой а так как я с таким первый раз работаю, поэтому решил всецело довериться.


NS   (2004-06-07 08:01:00) [23]

Смущает этот текст, ... оооочень смущает:
begin
Counter:=0;
//MessageBox(0, PChar(Application.ExeName), 'Message from keyhook.dll', 0);
{назначим поцедуру переменной DLLProc}
DLLProc:= @DLLEntryPoint;
{вызываем назначенную процедуру для отражения факта присоединения данной
 библиотеки к процессу}
DLLEntryPoint(DLL_PROCESS_ATTACH);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
end.
Зачем ее вызывать, если после объявления  DLLProc:= @DLLEntryPoint; при проецировании библиотеки в адресное пространство другого процесса данная проедура и так запустится!

2. Кидай по хук для клавиатуры, посмотрим, что там нарисовал.


DelphiN!   (2004-06-06 20:55:00) [24]

В Длл не надо никаких действий выполнять, просто посылай из Длл сообщение главному процессу, о нажатой клавише или че там тебе надо... А главный процесс пусть делает что надо с получиными от Длл данными


Sirgfine   (2004-06-06 05:38:00) [25]

Что-то текста много. Это всё проще делается...(если цель - незапустить калькулятор)


default   (2004-06-05 19:58:00) [26]

". Все работает только вот explorer постоянно недопустимые операции выполняет." так доставай ремень


Hedrox   (2004-06-05 19:43:00) [27]

Удалено модератором


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо