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

Вниз

Установка ловушки, не пойму, в чем траблы   Найти похожие ветки 

 
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 вся ветка

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

Наверх




Память: 0.47 MB
Время: 0.034 c
1-1088085346
Alex____
2004-06-24 17:55
2004.07.11
Как откомпилировать исходник ~70 Mb?


1-1088049555
Vilux
2004-06-24 07:59
2004.07.11
Перехват содержимого ClipBoard


3-1087301567
zevsus
2004-06-15 16:12
2004.07.11
Interbase(Firebird 1.5): Опустошение и репликация


8-1082635528
vin
2004-04-22 16:05
2004.07.11
TImage с быстрым Zoom и Pan


3-1086886333
valex1
2004-06-10 20:52
2004.07.11
отладка хранимых процедур