Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.10.24;
Скачать: CL | DM;

Вниз

вопросы по хукам   Найти похожие ветки 

 
Новенький в Делфи   (2002-10-15 15:30) [0]

вот исходник DLL

uses
Windows, sysutils;
const
MMFName: PChar = "KeyMMF";
type
PGlobalDLLData = ^TGlobalDLLData;
TGlobalDLLData = packed record
SysHook: HWND;
MyAppWnd: HWND;
end;

var
GlobalData: PGlobalDLLData;
MHandle: THandle;
WM_KEYHOOK: 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;
if lPAram<0 then SendMessage(GlobalData^.MyAppWnd, WM_KEYHOOK, wParam, 0);
CallNextHookEx(GlobalData^.SysHook, Code, wParam, lParam);
Result:= 0;
end;



procedure hook(switch : Boolean; hMainProg: HWND) export; stdcall;
begin
if switch then
begin
GlobalData^.SysHook := SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, HInstance, 0);
GlobalData^.MyAppWnd:= hMainProg;
end else
begin
UnhookWindowsHookEx(GlobalData^.SysHook);
CloseGlobalData;
end
end;

procedure OpenGlobalData();
begin
WM_KEYHOOK:= RegisterWindowMessage("WM_KEYHOOK");
MHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
GlobalData:= MapViewOfFile(MHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
end;

procedure CloseGlobalData();
begin
UnmapViewOfFile(GlobalData);
CloseHandle(MHandle);
end;

procedure DLLEntryPoint(dwReason: DWord); stdcall;
begin
case dwReason of
DLL_PROCESS_ATTACH: OpenGlobalData;
DLL_PROCESS_DETACH: CloseGlobalData;
end;
end;

exports hook;

begin
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.


Когда работает программа, то всё нормально, когда запускаю другую свою рограмму, которая использует такую же dll, то после того как она поймала первую же клавишу, возникает ошибка Stak Overflow. ???

И ещё, как сделать что-то вроде фильтра, например человек в текстовом редакторе (блокнот к примеру) что-то пишет, и если нажимает на определённую клавишу, то эта клавиша не появляется.

Спасибо


 
Новенький в Делфи   (2002-10-15 19:58) [1]

..


 
Юрий Зотов ©   (2002-10-15 20:10) [2]

Код, вроде бы, нормальный, но есть одно подозрение. Уточните, что именно делает эта Ваша "другая" программа, получив сообщение WM_KEYHOOK.

Если ее действия приводят к посылке клавиатурного сообщения, то возникает бесконечная рекурсия (c итогом в виде Stack Overflow).



Страницы: 1 вся ветка

Текущий архив: 2002.10.24;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.012 c
1-78381
ruslan_as
2002-10-15 09:46
2002.10.24
Найти решение


1-78383
MV-GROB
2002-10-15 10:51
2002.10.24
Почему не выполняется запрос?


1-78407
DAXg
2002-10-11 23:45
2002.10.24
Ув. Мастера, как можно узнать, запущена ли программа C: proga pro


3-78263
NeyroSpace
2002-10-02 12:47
2002.10.24
Есть ли какие-ниб. системные переменные, характеризующие...


14-78589
Cobalt
2002-10-02 16:04
2002.10.24
Может кто знает, чья это фраза?