Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.10.2010, 09:59   #1
Radical_Edward
Пользователь
 
Аватар для Radical_Edward
 
Регистрация: 05.08.2010
Сообщений: 33
По умолчанию Работа с хуками в C#

Есть такая вот задача. Мне необходимо перехватывать сообщение о разворачивании, по возможности, сворачивании некоторого окна.
Насколько мне известно, все это и немного больше можно получить использовав хук WH_CBT, однако проблема том, что C# как - то коряво с ним работает(хук, вроде, глобальный).

Подскажите, можно ли установить его на конкретный процесс и, если да, то как?

P.S : понятное дело, что все это держится на dllimport'ах...
Radical_Edward вне форума Ответить с цитированием
Старый 18.10.2010, 10:05   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

1. Покажите код
2. Видимо .dll содержащая хук написана на C/C++ ?
3. Причем тут C#? Он работает нормально, это у вас проблема вашей реализации. И опять таки покажите код
4. На один процесс вешать можно, только это уже будет некая надстройка над глобальным хуков всеравно
BOBAH13 вне форума Ответить с цитированием
Старый 18.10.2010, 10:17   #3
Radical_Edward
Пользователь
 
Аватар для Radical_Edward
 
Регистрация: 05.08.2010
Сообщений: 33
По умолчанию

01)В конце. Должен признаться, что в интернете не нашел реализации этого хука на шарпе, поэтому делал по аналогии с хуком KEYBOARD_LL
02)А зачем здесь dll?
03)Охотно верю посему и спрашиваю.
04)Ну вот, снова таки, зачем dll - ка для глобального хука?

Код:
private delegate IntPtr CBTProc(int nCode, IntPtr wParam, IntPtr lParam);
private const int WH_CBT = 13;
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr SetWindowsHookEx(int idHook, CBTProc lpfn, IntPtr hMod, uint dwThreadId);

private static IntPtr SetCBTHook(CBTProc proc)
        {
            using (Process curProcess = Process.GetCurrentProcess())
            {
                using (ProcessModule curModule = curProcess.MainModule)
                {
                    return SetWindowsHookEx(WH_CBT, proc, GetModuleHandle(curModule.ModuleName), 0);  
                }
            }
        }
        private int CBTCallBackEventHandler(int nCode, IntPtr wParam, IntPtr lParam)
        {
            MessageBox.Show("!");
            Application.Exit();
            return 0;
        }

Последний раз редактировалось Radical_Edward; 18.10.2010 в 10:22.
Radical_Edward вне форума Ответить с цитированием
Старый 18.10.2010, 12:45   #4
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Ну вот, снова таки, зачем dll - ка для глобального хука?
1. http://msdn.microsoft.com/en-us/libr...60(VS.85).aspx
2.
Цитата:
You must place a global hook procedure in a DLL separate from the application installing the hook procedure. The installing application must have the handle to the DLL module before it can install the hook procedure. To retrieve a handle to the DLL module, call the LoadLibrary function with the name of the DLL. After you have obtained the handle, you can call the GetProcAddress function to retrieve a pointer to the hook procedure. Finally, use SetWindowsHookEx to install the hook procedure address in the appropriate hook chain. SetWindowsHookEx passes the module handle, a pointer to the hook-procedure entry point, and 0 for the thread identifier, indicating that the hook procedure should be associated with all threads in the same desktop as the calling thread. This sequence is shown in the following example.
BOBAH13 вне форума Ответить с цитированием
Старый 18.10.2010, 15:31   #5
Radical_Edward
Пользователь
 
Аватар для Radical_Edward
 
Регистрация: 05.08.2010
Сообщений: 33
По умолчанию

Эмм...ну странно ведь. У меня есть код, который ставит хук WH_KEYBOARD_LL (глобальный, понятное дело) без разных dll. в чем отличие, не могу понять?!
Radical_Edward вне форума Ответить с цитированием
Старый 18.10.2010, 15:51   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Сообщение от Radical_Edward Посмотреть сообщение
Эмм...ну странно ведь. У меня есть код, который ставит хук WH_KEYBOARD_LL (глобальный, понятное дело) без разных dll. в чем отличие, не могу понять?!
если еще не понятно, то я привел правила данного API описанного в MSDN, то что вы называете глобальным, возможно есть локальное, а именно внутри вашего приложения, и не распространяется на другие. Если не верите мне и MSDN, объясню логику хуков. Код находящийся в .dll, включая функцию обработки хука, система загружает во все процессы, таким образом данный код (ваш код в .dll) находится в адресном пространстве всех процессов, и тогда система при обработки каких либо действий, в соответствии хуку, пускает сообщение по цепочки установленных хуков, а именно по цепочке функций и в какой то момент вашему обработчику.

Т.е. исходя из всего этого, ваш код, обработчик хука, просто не может быть глобальным и при этом находится только в адресном простанстве вашего приложения.
BOBAH13 вне форума Ответить с цитированием
Старый 18.10.2010, 16:33   #7
Radical_Edward
Пользователь
 
Аватар для Radical_Edward
 
Регистрация: 05.08.2010
Сообщений: 33
По умолчанию

Конечно, я прекрасно понимаю суть хуков.
Ознакомьтесь с этим кодом. То о чем я говорил : товарищ создал вполне глобальный хук БЕЗ использования любых импортов в виртуальное адресное пространство.

P.S : В любом случае, нет ли у вас, случаем, примера работы с WH_CBT. У меня с ним даже на С++ проблемы были..
Radical_Edward вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
(C++) Работа с Win API, ХУКАМИ. stribogaaa Общие вопросы C/C++ 10 12.05.2010 18:12
И опять проблема с хуками. Приложение само закрывается Altera Win Api 10 16.03.2010 19:39
Немогу разобраться с хуками! Altera Win Api 12 14.12.2008 17:15