2009-10-20 1 views
0

Я использовал код, приведенный в следующей статье CodeProject в прошлом, с успехом, но, похоже, частично работает на Vista/7 (я предполагаю, из-за UAC) , Он работает для текущей темы, но не поднимает активность системы. Я попытался добавить requireAdministrator в манифесты и подписать как неуправляемые, так и управляемые сборки, и это, похоже, не помогает.System Wide Shell Hook из .NET с использованием неуправляемой DLL

Using Window Messages to Implement Global System Hooks in C#

Моей главной цель состоит в том, чтобы использовать SetWindowsHookEx, чтобы поймать сообщения HSHELL_WINDOWCREATED и HSHELL_WINDOWDESTROYED в неуправляемой сборке, и уведомить об этом C# приложения таким образом, что он может использовать эту информацию в режиме реального времени. Это в основном просто нужно знать, когда окно создается или уничтожается в системе.

Я также нашел пример приложения, который является чистым C/C++, который отлично работает в Vista/7, но я действительно не хочу писать все приложение на C/C++, как я предпочитаю C#.

System Wide Hook Example that Works

Каждый знает, как исправить код в первой статье CodeProject так, что он работает на Vista/7, а? Или есть другие примеры способов, которыми я могу это сделать, не создавая таймеров и подобных хаков в C#?

Спасибо, Марк

ответ

2

взглянуть на мою программу: http://wpfklip.codeplex.com. Я реализовал общесистемный обходной крючок, чтобы программа могла ловить созданное окно, активировалось и так далее. И это написано в C#

+1

я не знал о существовании RegisterShellHookWindow в User32 ... что делает вещи намного проще. Спасибо за то, что поделился этим! В конце концов, я узнал что-то новое. :) Я собираюсь сыграть с ним немного сегодня, и если я смогу заставить его работать, я дам вам ответ. Еще раз спасибо. – Lusid

0

Там ключевой момент здесь, хотя:

1) Lusid ищет крючок оболочки. Они не работают в .NET для объяснений «DLL-инъекций», объясненных в первой статье, с которой связан Lusid.

2) Трикстер написал крючок для клавиатуры. Они отлично работают на C# (потому что они связаны с какой-то частью окон, а не с конкретным приложением, и могут справиться с внедрением .NET).