Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.10.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
Новенький в Делфи   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.008 c
6-78564
MikeZ
2002-08-22 23:48
2002.10.24
Вопрос: сеть и страница авторизации


3-78215
vis79
2002-10-03 09:43
2002.10.24
DLL и QuickReport


1-78504
XPatriot()
2002-10-13 17:59
2002.10.24
Работа с Image м.


14-78666
Agent Smith
2002-10-04 19:01
2002.10.24
Сервер удаленного доступа и WinXP Pro


3-78203
NewI
2002-09-30 08:42
2002.10.24
Как получить кол-во записей в TQuery. RecordCount не





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