Главная страница
    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.46 MB
Время: 0.033 c
14-1087991603
Daniel_
2004-06-23 15:53
2004.07.11
Как зарегестрировать шрифт в системе?


3-1087038563
Swimmer
2004-06-12 15:09
2004.07.11
Firebird


1-1088179756
Lampa
2004-06-25 20:09
2004.07.11
Синхронизация


4-1086092265
Андрей Сенченко
2004-06-01 16:17
2004.07.11
К вопросу по ALT-F4 и прочем


4-1085593687
Nese
2004-05-26 21:48
2004.07.11
Kak delat chto bi, u dannoy forme bil svoy hendle na TaskBar-e





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