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