Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хук в отдельном потоке службы 
V
    Опции темы
Leonid1611
Дата 22.9.2008, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.4.2008

Репутация: 1
Всего: 1



Здравствуйте.
Есть класс для работы с хуком (учитывает пользовательскую активность). Из под консольного приложения все запускается и работает.
Хочу делать это из службы для чего в службе создается отдельный поток в котором хук и устанавливается.
Служба запускается нормально но при завершении вываливается ошибка (в Win32Exception) - "Неверный дескриптор обработчика" при вызове UnhookWindowsEx. 
Метод установки хука:
Код

        private void Start(bool InstallMouseHook, bool InstallKeyboardHook)
        {
            startTime = DateTime.Now;

            // хук мыши 
            if (InstallMouseHook && hMouseHook == IntPtr.Zero)
            {
                //создаем процедуру 
                MouseHookProcedure = new HookProc(MouseHookProc);
                hMouseHook = SetWindowsHookEx(
                    WH_MOUSE_LL,
                    MouseHookProcedure,
                    Marshal.GetHINSTANCE(this.GetType().Module),
                    //Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),
                    0);
                //получаем дескриптор
                if (hMouseHook == IntPtr.Zero)
                {
                    int error = Marshal.GetLastWin32Error();
                    Stop(true, false, false);
                    throw new Win32Exception(error);
                }
            }
            // хук клавиатуры
            if (InstallKeyboardHook && hKeyBoardHook == IntPtr.Zero)
            {
                KeyboardHookProcedure = new HookProc(KeyboardHookProc);
                hKeyBoardHook = SetWindowsHookEx(
                        WH_KEYBOARD_LL,
                        KeyboardHookProcedure,
                        Marshal.GetHINSTANCE(this.GetType().Module),
                        //Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),
                        0);

                if (hKeyBoardHook  == IntPtr.Zero)
                {
                    int error = Marshal.GetLastWin32Error();
                    Stop(false, true, false);
                    throw new Win32Exception(error);
                }
            }
            // Устанавливаем таймер 
            timer = new System.Timers.Timer(delay);
            timer.AutoReset = false;            
            timer.Start();            
        }

Метод удаления хука:
Код

 private void Stop(bool UnInstallMouseHook, bool UnInstallKeyboardHook, bool ThrowExceptions)
        {
            if (hMouseHook != IntPtr.Zero && UnInstallMouseHook)
            {
                // расхучить 
                bool retMouse = UnhookWindowsHookEx(hMouseHook);
                hMouseHook = IntPtr.Zero;
                if (!retMouse && ThrowExceptions)
                {
                    int error = Marshal.GetLastWin32Error();
                    throw new Win32Exception(error);
                }
            }
            if (hKeyBoardHook != IntPtr.Zero && UnInstallKeyboardHook)
            {
                bool retKeyBoard = UnhookWindowsHookEx(hKeyBoardHook);
                hKeyBoardHook = IntPtr.Zero;
                if (!retKeyBoard && ThrowExceptions)
                {
                    int error = Marshal.GetLastWin32Error();
                    throw new Win32Exception(error);
                }
            }
        }

Методы OnStart и OnStop сервиса :
Код

        protected override void OnStart(string[] args)
        {
           
            log = new StreamWriter(new FileStream("log.txt",FileMode.Append));            
            logger = new Logger(log);
            ts = new Thread(new ThreadStart(logger.Start));
            ts.Start();

        }

        protected override void OnStop()
        {
            // TODO: Add code here to perform any tear-down necessary to stop your service.            
            logger.Stop();            
            ts.Abort();
        }


Подскажите пожалуйста почему неверный дескриптор.

PM MAIL   Вверх
Leonid1611
Дата 23.9.2008, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 2.4.2008

Репутация: 1
Всего: 1



Разобрался с проблемой. Необходимо было:
1) Запустить в потоке цикл обработки сообщений (message loop) - System.Windows.Forms.Application.Run()
2) Разрешить сервису взаимодействие с рабочим столом - Службы - Свойства - Вход в систему - Разрешить взаимодействие с рабочим столом.
PM MAIL   Вверх
Ronin08
Дата 24.9.2008, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 16.2.2008
Где: г.Москва

Репутация: 1
Всего: 1



Спасибо. Очень пригодились в качестве пимера твои исходники!
--------------------
Зачем вставать рано или поздно? Надо вставать вовремя
PM MAIL   Вверх
SoulJr
Дата 10.6.2011, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 10.6.2011

Репутация: нет
Всего: нет



Не могли бы кто нибудь првести полный исходник данного примера...необходимо такая же служба для сдачи курсовой
PM MAIL   Вверх
SoulJr
Дата 10.6.2011, 16:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 10.6.2011

Репутация: нет
Всего: нет



 logger = new Logger(log);
я не понял откуда взялся этот логер?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0458 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.