Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
1-1088524227
hgd
2004-06-29 19:50
2004.07.11
Как подсоединить Excel к Delphi


9-1080245106
GunmeN
2004-03-25 23:05
2004.07.11
Дым войны


14-1087797463
ПсихЪ
2004-06-21 09:57
2004.07.11
Глюки форума при рефреше (F5)


1-1088031380
sashapont
2004-06-24 02:56
2004.07.11
Как организовать правильно Drag&amp;Drop


14-1087991603
Daniel_
2004-06-23 15:53
2004.07.11
Как зарегестрировать шрифт в системе?





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