Форум: "WinAPI";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
ВнизУстановка ловушки, не пойму, в чем траблы Найти похожие ветки
← →
Vilux (2004-05-30 10:19) [0]Соб-но все достаточно просто - устанавливаю ловушку на нажатие кнопки, и при срабатывании пишу в файл кое-какие данные. Проблема в том, что ловушка перестает работает по непонятным причинам. Например я ее пускаю в Far"е, она работает, когда запускаю блокнот, то она перестает работает везде, даже в Far"е... Очень прошу - помогите, альтернативные варианты не очень интересны, интересно узнать, почему этот пример не работает как надо. Вот исходники
---------main.pas--------
unit main;
interface
uses
Windows, Messages, SysUtils, Forms, registry, Classes, ExtCtrls;
const
MMFName: PChar = "MyMMF2"; // имя объекта файлового отображения
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;
type
MyProcType = procedure (flag : Boolean;capt,dir:string); stdcall;
PGlobalDLLData = ^TGlobalDLLData;
TGlobalDLLData = packed record
SysHook: hhook; // дескриптор установленной ловушки
capt:string;
dir:string;
end;
var
Form1: TForm1;
hinstDLL: HINST;
hook: TFNHookProc;
GlobalData: PGlobalDLLData;
MMFHandle: THandle;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
if MMFHandle = 0 then
MessageBox(0, "Can""t create FileMapping", "Message from Exampel2/Process2", 0);
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 Exampel2/Process2", 0);
end;
hinstDLL := LoadLibrary(pchar("sendkey.dll"));
if HinstDll > HINSTANCE_ERROR then { если всё без ошибок, то }
begin
hook:=GetProcAddress(HInstDLL, "Key_Hook"); { получаем указатель на необходимую процедуру}
GlobalData^.SysHook := SetWindowsHookEx(WH_KEYBOARD,hook, HInstance, 0);
GlobalData^.capt:="capt";
GlobalData^.dir:="c:\kkk\keys.txt";
if GlobalData^.SysHook <> 0 then
MessageBox(0, pchar("HOOK2 установлен !"+inttostr(GlobalData^.SysHook)), "Message from Exampel2/Process2", 0)
else
MessageBox(0, "HOOK2 установить не удалось !", "Message from Exampel2/Process2", 0);
end;
UnmapViewOfFile(GlobalData);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
freelibrary(hinstdll);
CloseHandle(MMFHandle);
end;
end.
---------end of main.pas--------
---------SENDKEY.DPR--------
library SendKey;
uses SysUtils, Windows,dialogs;
const
MMFName: PChar = "MyMMF2"; // имя объекта файлового отображения
{структура, поля которой будут отображены в файл подкачки}
type
PGlobalDLLData = ^TGlobalDLLData;
TGlobalDLLData = packed record
SysHook: HWND; // дескриптор установленной ловушки
capt:string;
dir:string;
end;
var
GlobalData: PGlobalDLLData;
MMFHandle: THandle;
procedure OpenGlobalData;
begin
MMFHandle:= OpenFileMapping(FILE_MAP_ALL_ACCESS , false, MMFName);
if MMFHandle = 0 then
MessageBox(0, "Can""t create FileMapping", "Message from Exampel2/Process2", 0);
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 Exampel2/Process2", 0);
end;
end;
procedure CloseGlobalData;
begin
UnmapViewOfFile(GlobalData);
CloseHandle(MMFHandle);
end;
function Key_Hook(Code: integer; wParam: word; lParam: Longint): Longint;stdcall; export;
var f:text;
hook:hwnd;
begin
OpenGlobalData;
assignfile(f,GlobalData^.dir);
if not fileexists(GlobalData^.dir) then
begin
rewrite(f);
closefile(f);
end;
append(f);
writeln(f,GlobalData^.dir+" "+inttostr(GlobalData^.SysHook));
closefile(f);
hook:=GlobalData^.SysHook;
CloseGlobalData;
CallNextHookEx(hook,Code, wParam, lParam);
Result:=0;
end;
exports Key_Hook;
begin
end.
---------end of SENDKEY.DPR--------
← →
Vilux (2004-05-30 13:17) [1]Блин, неужели никто не поможет? Тут же в принципе немного кода...знать бы только где загвоздка.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.054 c