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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.05.2013, 01:50   #1
Bezurog
 
Регистрация: 01.02.2011
Сообщений: 4
По умолчанию Установка хука на клавиатуру в сервисе

Всем доброго времени суток. Хотел написать в раздел для профи но не пустили.

Я ставлю глобальный хук на клавиатуру в консольном приложении, пока хук установлен, все нажатия во всех окнах записываются в лог. Однако когда я ставлю хук из той же DLL но уже в сервисе (службе), функция фильтр уже не вызывается в приложениях, хотя SetWindowsHookEx() возвращает не ноль, то есть установка осуществляется успешно, единственно что удаление не срабатывает в службе (хотя тот же самый код в консоли работает). GetLastError() возвращает 1404.

Служба после запуска устанавливает хук, когда посылается сигнал на завершение снимает хук(неудачно) и останавливается. Подскажите, пожалуйста, в чем может быть проблема?

Код функции-фильтра из DLL:
Код:
extern "C" _declspec(dllexport) LRESULT   CALLBACK  FilterFunction(int code, WPARAM wParam, LPARAM lParam)
{
	if(code < 0)  
		return CallNextHookEx(0, code, wParam, lParam); 

	FILE* fp = fopen("E:\\Distr\\hiew32demo\\keys.log","a");   
	fprintf(fp, "down: %c\n", (char) wParam);				   
	fclose(fp);

	return CallNextHookEx(0, code, wParam, lParam);
}
Код установки сервисом хука (успешный, возврат 0)
Код:
	
BOOL InitMyServiceData() 
{
	DllHandle = LoadLibrary(L"D:\\Projects\\VS2010\\testService\\Debug\\HookLibrary1.dll"); 
	if (!DllHandle)	
		return 1;
	
	HOOKPROC InstHook = (HOOKPROC) GetProcAddress(DllHandle, "_FilterFunction@12"); 
	if (!InstHook) 
		return 2;

	HookHandle = SetWindowsHookEx(WH_KEYBOARD, InstHook, DllHandle, 0); 
	if (!HookHandle) 
		return 3;

	return 0;
}
Код снятия сервисом хука (неудачно, возвращает 1404):
Код:
BOOL StopMyService() 
{
	if (!DllHandle) 
		return 1;

	if (!HookHandle)
                return 2;

	if (UnhookWindowsHookEx(HookHandle)==0)
		return GetLastError();

	FreeLibrary(DllHandle);
	return 0;
}

Последний раз редактировалось Bezurog; 21.05.2013 в 02:01. Причина: bb-коды
Bezurog вне форума Ответить с цитированием
Старый 21.05.2013, 07:55   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ERROR_INVALID_HOOK_HANDLE

1404 (0x57C)

Invalid hook handle.
Так что либо SetWindowsHookEx что-то не то делает либо скорее всего ты не ту переменную передаешь в StopMyService

P.S. Это ИМХО.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.05.2013, 09:02   #3
Bezurog
 
Регистрация: 01.02.2011
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Так что либо SetWindowsHookEx что-то не то делает либо скорее всего ты не ту переменную передаешь в StopMyService
Дело в том, что такой же код полностью работает в консольном приложении. Проблема именно в службе. То есть код перед остановкой служба почему-то теряет хендл хука, хотя он у меня глобальный и установка хука вроде проходит.

Обнаружил интересную вещь. В точке входа службы прописал запуск службы, установку хука, задержку (Sleep) на пять секунд и снятие хука с остановкой службы, то есть все сделал в одной функции. Теперь код возврата 0, то есть все успешно, но хук не работает, то есть функция-фильтр не пишет в файл при вводе с клавиатуры, хотя, повторюсь, в консольном приложении все работает
Bezurog вне форума Ответить с цитированием
Старый 21.05.2013, 23:09   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Вот чесслово глубуко так не копал. Может для служб и есть особенности.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Защита от хука Zombie_Killer Win Api 1 16.03.2012 08:23
Проблема с установкой хука DeFace Win Api 0 07.09.2011 08:06
Создание log файла в сервисе nikcpp Общие вопросы Delphi 9 26.04.2011 19:49
правильное снятие хука majestic Win Api 1 11.01.2010 02:52
Перехват сообщений в сервисе mosian Win Api 0 22.07.2009 12:18