C ++ Event Hooks - PullRequest
       10

C ++ Event Hooks

1 голос
/ 27 ноября 2010

Я пытаюсь понять перехват событий в C ++. Я знаю, что такое событие, я часто использовал их в Java, C # и Javascript.

У меня проблемы с поиском документации и учебников по таким вещам, как глобальные хуки, внедрение DLL, глобальные хуки без DLL.

Допустим, я хотел бы перебрать вкладки браузера в FireFox ... Надеюсь, у FireFox есть API для C ++? Или допустим, что я хотел бы что-то сделать, когда пользователь открывает новую вкладку, нужно ли мне использовать ловушку, которую FireFox предоставит в своем API?

Выше приведен только пример, чтобы люди знали, что я пытаюсь выучить / понять. Я думаю о правильных Инес?

Я видел сообщение на форуме, и за последние 2 часа я проявил интерес. Я всегда говорю, что хитрый вызов или новый вызов делает программиста сильнее.

Буду очень признателен за любые ресурсы или любую помощь.

Ответы [ 3 ]

3 голосов
/ 27 ноября 2010

Найдите MSDN для SetWindowsHookEx.Это должен быть ваш вход в Windows.Если вы нацеливаете окно parituclar для системы, то менее навязчивым вариантом является SetWindowLongPtr.Для первого API вам понадобится инъекция Dll, которая автоматически предоставляется системой.Просто выполните следующие действия:

Создайте Dll, которая экспортирует функцию HOOKPROC (фактический тип зависит от типа хука - читайте в документации)

Загрузите этот Dll в ваше приложение и получите указатель нафункция HOOKPROC.Для этого могут использоваться API-интерфейсы LoadLibrary / GetProcAddress.

Из вашего приложения вызовите SetWindowsHookEx, передавая соответствующие параметры - это введет dll в целевой процесс.Итак, DLL теперь загружена как в процесс вашего приложения, так и в целевой процесс.Таким образом, вам понадобится механизм для IPC между двумя процессами, вероятно.Здесь много способов - сокеты, каналы, общий сегмент в DLL, файловая система, сообщения Windows, COM-серверы + события и т. Д. И т. Д.

Предыдущий API, хотя и менее мощный, не требует внедрения DLL.

Выберите мудро и удачи!

3 голосов
/ 27 ноября 2010

Сам C ++ не имеет событий или хуков, но многие библиотеки и платформы C ++ реализуют их.Пример библиотеки универсальных событий см. В Boost.Signals .

. Некоторые из реализаций позволяют просматривать свои события в других приложениях, но API зависит от приложения (например, для Firefox.см. XPCOM ).


Windows имеет механизм хуков, который позволяет отслеживать различные события в своей оконной системе.Однако это особенность ОС, не связанная с C ++.Поскольку это системный механизм, это влияет на все приложения Windows, даже если они ничего для этого не делают.Документацию по хукам Windows можно найти здесь .Кроме того, поскольку вы упомянули «глобальные перехватчики без DLL», см. SetWinEventHook , который является API более высокого уровня, чем перехваты Windows, связанные выше, и может использоваться с функциями перехвата, реализованными как в DLL, так и в EXE.*
0 голосов
/ 27 ноября 2010

Я не думаю, что Firefox будет иметь C ++ aPI для поиска открытых вкладок .... Если вы хотите узнать открытые вкладки или когда открыта новая вкладка, вы можете в основном подключить окно Firefox и получать все события, происходящиев этом окне к вашей подключаемой процедуре.

Если вы откроете spy ++ в VC ++ и отследите окно firefox, вы увидите, что новый MozillaContentWindowClass создается каждый раз, когда открывается новая вкладка.Таким образом, вы можете перебирать дескрипторы окон и получать информацию об открытых вкладках.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...