![]() |
|
|
#1
|
|||
|
|||
|
Здравствуйте, уважаемые профессионалы!
У меня есть dll с хуком, отлавливающим нажатие клавиш. Есть объект, тип которого описан в отдельном модуле и используется в dll. Есть массив, где хранится количество каждой нажатой клавиши по адресу wParam и строка, которая логгирует все нажатия. Код:
type
TKeyboardMap=array[0..255] of word;
TKeyboard=class
private
mas: TKeyboardMap ;
s:string;
public
procedure addPress(ws:word; ls: longint);
property map:TKeyboardMap read mas;
property st:string read s;
constructor create;
end;Код:
library KeyboardHook;
{$R *.res}
uses
Sharemem,
Messages,
Windows,
KeyboardUnit in 'KeyboardUnit.pas';
var SysHook: hHook = 0;
keyboard: TKeyboard ;
function GetKeyboard:Tkeyboard; export; stdcall;
begin
result:=keyboard;
end;
function KeyboardProc(Code: Integer; wParam: WParam; LParam: LParam): integer; stdcall;
begin
if byte(LParam shr 24)<$80 then //key is pressed
begin
keyboard.addPress(wParam, lParam);
end;
result:=CallNexthookEx(SysHook, code, WParam, LParam);
end;
procedure RunStopHook(State: Boolean) export; stdcall;
begin
if State then
begin
keyboard:=TKeyboard.create;
SysHook:= SetWindowsHookEx(WH_KEYBOARD, @KeyboardProc, hInstance, 0)
end
else
begin
UnhookWindowsHookEx(SysHook);
SysHook:=0;
keyboard.Destroy;
end;
end;
exports RunStopHook, GetKeyboard;
end. |
|
#2
|
|||
|
|||
|
Ну, для начала, если ты хочешь передавать строки из/в dll, то надо еще включить модуль ShareMem (и положить соотв. доп dll). String - это не безопасный тип и память под него выделяется определенным образом.
Вообще, лучше уж тогда поменить String на PChar, вот этот тип безопасен. |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
T232006 (20.03.2024)
| ||