Установка хука в потоке
От: 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.