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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2015, 23:29   #1
slipknot7909
 
Регистрация: 24.02.2015
Сообщений: 6
По умолчанию wh_keyboard при срабатывание зависают некоторые системные программы

Искал в интернете не нашел почти ничего. такое дело,при срабатывание хука в том же проводнике или блокноте они виснут,в студии той же или браузере все нормально.думаю что код нет смысла приводит потому что удалял все из функции фильтра и ничего не изменилось(CallNextHookEx ясен пень оставил). Сам делаю курсовую на эту тему и во всей этой теме слабо шарю. спасайте. это конечно не критично и преподша сказала что типа ты уже больше меня тут знаешь, но все таки хочется исправить.
slipknot7909 вне форума Ответить с цитированием
Старый 12.03.2015, 00:02   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

может вы управление не возвращаете или определенные проги просто обязаны обработать клавишу, а её нет или она не доходит. Вот и виснут.
Человек_Борща вне форума Ответить с цитированием
Старый 12.03.2015, 22:38   #3
slipknot7909
 
Регистрация: 24.02.2015
Сообщений: 6
По умолчанию

я тоже так думал,поэтому сделал три вызова функции CallNextHookEx,что бы в любом случае вернул,но не помогает. правда я исходники брал из чъей то программы потому что сам плохо знаком с такими темами,спросить не у кого. попробовал исходник длл который брал как образец,выдает тоже самое.

вот исходный код длл, с ним так же зависают,может дело в основной программе?(не сидьно логично конечно но вдруг).в проге просто идет вызов sethook.
Код:
#include "stdafx.h"
#include <windows.h>
#include "dll.h"

#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif

EXPORT LRESULT CALLBACK MouseProc(int code, WPARAM wParam, LPARAM lParam);
HHOOK hLock;
HINSTANCE hHookDll;
int AppActivated;

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
	switch(ul_reason_for_call)
     {
         case DLL_PROCESS_ATTACH: // вызывается каждый раз когда новый процесс грузит DLL в свою память
         {
			 hHookDll=hModule;
			 AppActivated=0;
             break;
         }
          case DLL_PROCESS_DETACH:
         { // Снимать хуки
		   // Система делает это автоматически
		    UnhookWindowsHookEx(hLock);
             break;
         }
         default:
             break;
     }
     return TRUE ;
}
EXPORT int SetHook(BOOL bSet) // Функция устанавливает/снимает хук в зависимости от bSet
 {
     if(bSet) // Если устанавливаем
     {
         if(hHookDll) // Если загружена библиотека
         {
             // то установим хук
             hLock = SetWindowsHookEx(	WH_KEYBOARD, // тип хука
									    &KeyProc,    // хук-функция
										hHookDll,	 // хендл библиотеки с хук-функцией
										NULL);
				return 55;
             if(hLock == NULL) // Если хук не установился, вернем ошибку
				return 2;
         }
         else
             return 1;
     }
     else // Если снимаем хук
         UnhookWindowsHookEx(hLock);
     return 0;
 }

EXPORT LRESULT CALLBACK KeyProc(int code, WPARAM wParam, LPARAM lParam)
{
	HWND hNote = FindWindow(NULL,"Untitled - Notepad");
	if(hNote == NULL)MessageBox(NULL,"Окошко та не открыто)","Ошибка",NULL);
	if(hNote)
	{
		switch(wParam)
		{
		case VK_F2:
			if(GetAsyncKeyState(VK_SHIFT))
			MessageBox(hNote,"Был поставлен хук:)","Авторы",NULL);
			break;

		case VK_DOWN:
			if(GetAsyncKeyState(VK_SHIFT))
				CloseWindow(hNote);
				break;

		case VK_RIGHT:
			if(GetAsyncKeyState(VK_SHIFT))
			DestroyWindow(hNote);
			break;

		case VK_UP:
			if(GetAsyncKeyState(VK_SHIFT))
			ShowWindow(hNote,SW_MAXIMIZE);
			break;

		case VK_LEFT:
			if(GetAsyncKeyState(VK_SHIFT))
			OpenIcon(hNote);
			break;
		}
	}
	return CallNextHookEx(NULL, code, wParam, lParam);
}
еще я понятия не имел как отладку сделать с длл файла,почитал мсдн и получилось,вернул код 1 значит не загружена библиотека,теперь вопрос почему?

Последний раз редактировалось Stilet; 14.03.2015 в 11:12.
slipknot7909 вне форума Ответить с цитированием
Старый 12.03.2015, 23:31   #4
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

Может быть, не обработаны эти случаи:
Цитата:
DLL_THREAD_ATTACH - The current process is creating a new thread. When this occurs, the system calls the entry-point function of all DLLs currently attached to the process. The call is made in the context of the new thread. DLLs can use this opportunity to initialize a TLS slot for the thread. A thread calling the DLL entry-point function with DLL_PROCESS_ATTACH does not call the DLL entry-point function with DLL_THREAD_ATTACH.

Note that a DLL's entry-point function is called with this value only by threads created after the DLL is loaded by the process. When a DLL is loaded using LoadLibrary, existing threads do not call the entry-point function of the newly loaded DLL.

DLL_THREAD_DETACH A thread is exiting cleanly. If the DLL has stored a pointer to allocated memory in a TLS slot, it should use this opportunity to free the memory. The system calls the entry-point function of all currently loaded DLLs with this value. The call is made in the context of the exiting thread.
Smogg вне форума Ответить с цитированием
Старый 12.03.2015, 23:46   #5
slipknot7909
 
Регистрация: 24.02.2015
Сообщений: 6
По умолчанию

может.попробую и отпишусь.

а это не то?
Код:
switch(ul_reason_for_call)
     {
         case DLL_PROCESS_ATTACH: // вызывается каждый раз когда новый процесс грузит DLL в свою память
         {
			 hHookDll=hModule;
			 AppActivated=0;
             break;
         }
          case DLL_PROCESS_DETACH:
         { // Снимать хуки
		   // Система делает это автоматически
		    UnhookWindowsHookEx(hLock);
             break;
         }
         default:
             break;
     }

Последний раз редактировалось Stilet; 14.03.2015 в 11:12.
slipknot7909 вне форума Ответить с цитированием
Старый 13.03.2015, 04:19   #6
Smogg
Участник клуба
 
Регистрация: 14.06.2011
Сообщений: 1,138
По умолчанию

hHookDll изначально инициируется нулем. Изменяется только в case DLL_PROCESS_ATTACH: , следовательно, в этот кейс не заходится. однако ж, что-то возвращается, значит дллка загружена.

А вообще, интересно, что там за ошибка)
Smogg вне форума Ответить с цитированием
Старый 13.03.2015, 21:29   #7
slipknot7909
 
Регистрация: 24.02.2015
Сообщений: 6
По умолчанию

ну отладчик мне вернул вроде бы 1,а это вот откуда:
Код:
  if(hHookDll) // Если загружена библиотека
         {
             // то установим хук
             hLock = SetWindowsHookEx(	WH_KEYBOARD, // тип хука
									    &KeyProc,    // хук-функция
										hHookDll,	 // хендл библиотеки с хук-функцией
										NULL);
				return 55;
             if(hLock == NULL) // Если хук не установился, вернем ошибку
				return 2;
         }
         else
             return 1;
То есть библиотека не загружена и... дальше ничего не происходит?

я попробовал добавить в кейз то что ты писал,все тоже самое.

Последний раз редактировалось Stilet; 14.03.2015 в 11:12.
slipknot7909 вне форума Ответить с цитированием
Старый 28.03.2015, 02:08   #8
slipknot7909
 
Регистрация: 24.02.2015
Сообщений: 6
По умолчанию

идей ни у кого нет?
slipknot7909 вне форума Ответить с цитированием
Старый 06.04.2015, 13:27   #9
slipknot7909
 
Регистрация: 24.02.2015
Сообщений: 6
По умолчанию

Будет толк если перепишу на WH_KEYBOARD_LL?? и вообще какая разница будет?
slipknot7909 вне форума Ответить с цитированием
Старый 06.04.2015, 14:27   #10
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Адрес хук функции надо брать через GetProcAddress из загруженной DLL.

В DllMain не надо ставить хук, система сама грузит DLL и ставит вызов.
waleri вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Лишнее срабатывание ColumnChanged при переходе по строкам в DataTable Prigur Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 2 07.10.2013 15:16
Системные требования своей программы DIgorevich Свободное общение 4 17.06.2011 01:46
При установке ловушки на клавиатуру зависают приложения, запущенные от имени другого пользователя. _Lamer Visual C++ 2 22.11.2010 10:01
Не срабатывание русской кодировки при вводе символов с клавиатуры Syltan Общие вопросы C/C++ 5 24.05.2010 19:16
Системные программы Yar Софт 9 29.06.2009 11:58