Пошаговое выполнение программы в Delphi7 |
Cообщение скрыто для удобства комментирования.
Прочитать сообщение
Комментировать | « Пред. запись — К дневнику — След. запись » | Страницы: [1] [Новые] |
Исходное сообщение ZardoZ: Вешается, если в любом месте брэйкпоинт ставить? Пробовал на другой версии дельфы? У тебя отладчик установлен, который с дельфой ставится?
library keyhook;
uses
SysUtils,
Windows,// dialogs,
Messages;
const
MMFName: PChar = 'KeyMMF'; // имя объекта файлового отображения
{структура, поля которой будут отображены в файл подкачки}
type
PGlobalDLLData = ^TGlobalDLLData;
TGlobalDLLData = packed record
SysHook: HWND; // дескриптор установленной ловушки
MyAppWnd: HWND; // дескриптор нашего приложения
end;
var
GlobalData: PGlobalDLLData;
MMFHandle: THandle;
WM_MYKEYHOOK: Cardinal;
function KeyboardProc(code : integer; wParam : word; lParam : longint) : longint; stdcall;
begin
if code < 0 then
begin
Result:= CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
Exit;
end;
SendMessage(GlobalData^.MyAppWnd, WM_MYKEYHOOK, wParam, lparam);
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_KEYBOARD, @KeyboardProc, HInstance, 0);
GlobalData^.MyAppWnd:= hMainProg;
if GlobalData^.SysHook = 0 then
MessageBox(0, 'Cannot install HOOK!', 'Message from keyhook.dll', 0);
end
else
begin
{Удаляю функцию-фильтр, если она установлена (т.е. switch=false). }
if not UnhookWindowsHookEx(GlobalData^.SysHook) then
MessageBox(0, 'Cannot unistall 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,'Error: Can''t set hook','Message from keyhook.dll', MB_OK+MB_ICONERROR);
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;
exports hook;
begin
{назначим поцедуру переменной DLLProc}
DLLProc:= @DLLEntryPoint;
{вызываем назначенную процедуру для отражения факта присоединения данной
библиотеки к процессу}
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
GlobalData^.MyAppWnd:= hMainProg;
Комментировать | « Пред. запись — К дневнику — След. запись » | Страницы: [1] [Новые] |