Установка хука в потоке
От: Leonid1611 Россия  
Дата: 23.09.08 05:11
Оценка:
Возникла проблема с установкой хука в отдельном потоке. Поток необходим так как пишется служба. Из консольного приложения приведенный ниже фрагмент кода работает нормально. К сожалению не могу понять, как сделать чтобы работало в отдельном потоке.
Установка хука:
        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);
                }
            }
        }


При у становке хука в методе Start ошибки не происходит, но хук не срабатывает. При вызове метода Stop выбрасывается ошибка — "Неверный дескриптор обработчика".

23.09.08 16:22: Перенесено модератором из '.NET' — AndrewVK
Re: Установка хука в потоке
От: Pavel Dvorkin Россия  
Дата: 23.09.08 06:02
Оценка:
Здравствуйте, Leonid1611, Вы писали:

L>При у становке хука в методе Start ошибки не происходит, но хук не срабатывает. При вызове метода Stop выбрасывается ошибка — "Неверный дескриптор обработчика".


MSDN:

Therefore, the thread that installed the hook must have a message loop.

Есть ?
With best regards
Pavel Dvorkin
Re[2]: Установка хука в потоке
От: Leonid1611 Россия  
Дата: 23.09.08 09:04
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, Leonid1611, Вы писали:


L>>При у становке хука в методе Start ошибки не происходит, но хук не срабатывает. При вызове метода Stop выбрасывается ошибка — "Неверный дескриптор обработчика".


PD>MSDN:


PD>Therefore, the thread that installed the hook must have a message loop.


PD>Есть ?


А служба не имеет message loop? Тогда нет.
Re[3]: Установка хука в потоке
От: Leonid1611 Россия  
Дата: 23.09.08 09:32
Оценка:
Добавил Application.Run() при старте потока, ошибка в методе UnhookWindowsEx больше не происходит. Но сам хук не срабатывает.
Re[4]: Установка хука в потоке
От: Leonid1611 Россия  
Дата: 23.09.08 10:30
Оценка:
Необходимо было в свойствах службы разрешить взаимодействие с рабочим столом.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.