Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Как сделать глобальный хук?


Автор: Snoofie 14.9.2004, 23:17
Приветствую!
Модет у кого есть примерчик как сделать глобальный хук клавиатуры? Например для создания keylog'erа. Это вообще возможно? Помогите с примерчиком плз.

Автор: Kurt 15.9.2004, 00:51
Глобальный хук?
Это надо смотреть в сторону WinAPI, имхо, на .NET такого не сделаешь.. хм.. разве что вызов native dll'ей, но смысла тут использовать .NET вообще нет.

Автор: seagull 16.9.2004, 09:48
В данный момент я делаю подобную систему на VS C#.NET. И тут все выглядет абсолютно аналогично программирование не под .NET.
Самые необходимые вам функции SetWindowsHookEx и UnhookWindowsHookEx. В МСДН на эти функции есть примеры.

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

Snoofie, если Вы подскажете интересный способ как пересылать назад эту информацию в основное тело программы буду очень признателен.

Автор: Kurt 16.9.2004, 10:40
Цитата
если Вы подскажете интересный способ как пересылать назад эту информацию

...Виноват, не понял, о какой информации идет речь.. withstupid.gif

Автор: seagull 16.9.2004, 10:51
Kurt простите за мутную формулировку. smile.gif
Имеется ввиду что при установке хука мы передаем функции-обаботчик из ДЛЛ. Но проблема в том, как передать информацию из этой функции в саму програму.
Ведь реально эту функция запускается с адресным пространством процесса, которому назначается это сообщение, а следовательно ни функции нашей программы, которая создала хук, ни область данных не доступны.
Пока что мне на ум приходит лишь возможность использовать Pipe. Но все же хотелось бы какое-то более элегантное решение.

Автор: stab 18.9.2004, 05:00
seagull, не думаю что, что-то элегантное найдется... можно конечно WM_COPYDATA использовать или через сокеты слать smile.gif на худой конец shared mapped memory, но толку с этого -- всеравно все ручками писать sad.gif не видел я готовых простых решений для пересылки структур данных между процессами. Можно конечно старый добрый COM использовать, тогда все по-уму будет, но ручками через теже pipes явно проще и быстрее smile.gif

Автор: Vaulter 21.9.2004, 09:45
а как же делают глобальные горячие клавиши????? если нет никакой dll ?

Автор: seagull 21.9.2004, 10:43
Цитата(Vaulter @ 21.9.2004, 06:45)
а как же делают глобальные горячие клавиши????? если нет никакой dll ?

Через ВинАпи сделать глобальный хук (в том числе и на клавиатуру), который был бы в теле программы невозможно. Так как процедура хука по определению должна быть доступна всем процессм.

Автор: Solnishka 3.10.2005, 10:21
Народ!!! Такой вопрос: как при помощи хука заставить символьную клавишу производить действие стрелки? Вроде и подменяется клавиша на стрелку, но не передвигается курсор, хоть ты че хошь с ним делай!!! smile

Автор: oleg1973 3.10.2005, 11:01
ну дык поиск рулит по форуму )
уже писали про хук без длл (в ехешнике)
только по любому он там будет в виде отдельной процедуры естественно

Автор: #Sage 4.10.2005, 08:32
Snoofie (да и всем), думаю стоит глянуть эти две ссылки:

http://www.codeproject.com/csharp/GlobalSystemHook.asp
http://www.codeproject.com/csharp/globalhook.asp


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)