![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите разобраться с хуками
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]Удалено модератором