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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2015, 16:16   #1
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию Глобальный Hot-Key и отрисовка окна

Доброго времен суток!

Необходимо по нажатию комбинации клавиш отображать активное в данный момент окно поверх всех окон.

Для этого устанавливаю хук WH_CBT и при активизации окна для него устанавливается хот-кей. При закрытии окна хот-кей соответственно деинициализируется
Код:
LRESULT CALLBACK CbtHook(int code, WPARAM wParam, LPARAM lParam)
{
	if (code == HCBT_ACTIVATE)
	{
		RegisterHotKey((HWND)wParam, HotKeyId, MOD_ALT | MOD_CONTROL, VK_RETURN);
	}

	if (code == HCBT_DESTROYWND)
	{
		UnregisterHotKey((HWND)wParam, HotKeyId);
	}

	return CallNextHookEx(WndHotKeyHook, code, wParam, lParam);
}
Далее также хукается GetMessage(). Тип хука WH_GETMESSAGE. И обрабатывается сообщение хот-кея WM_HOTKEY. Если все ок, то окно рисуется поверх всех функцией
Код:
SetWindowPos(targetStruct->hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
Код функции хука
Код:
LRESULT CALLBACK WndProcHook(int code, WPARAM wParam, LPARAM lParam)
{
	if (code == HC_ACTION)
	{
		PMSG targetStruct = (PMSG)lParam;

		if (targetStruct->message == WM_HOTKEY)
		{


			if (targetStruct->hwnd)
			{
				TCHAR Buff[MAX_PATH];
				RtlSecureZeroMemory(Buff, MAX_PATH * sizeof(TCHAR));
				GetWindowText(targetStruct->hwnd, Buff, MAX_PATH);
				if ((_tcslen(Buff) <= 1) || (!_tcsstr(Buff, TEXT("OLEChannelWnd")))  || (!_tcsstr(Buff, TEXT("WorkerW"))))
				{
					BOOL res = SetWindowPos(targetStruct->hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
					if (!res)
						DBGMSG(TEXT("TOPMOST failed"));
				}
			}
		}

	}

	return CallNextHookEx(WndMessHook, code, wParam, lParam);
}
Проблема в том, что вместо текущего активного окна попадается какой-то шлак. Причем иногда даже с пустым заголовком, несмотря на проверку (_tcslen(Buff) <= 1). Как найти нужное окно? Или может кто-нибудь знает, как решить данную проблему другим более простым способом. Буду благодарен за советы
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 28.11.2015, 17:27   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Если окно в другом процессе вполне возможно, что GetWindowText не сможет вернуть результат.

Зачем вообще нужна проверка, если хук привязан к окну?
waleri вне форума Ответить с цитированием
Старый 28.11.2015, 18:03   #3
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Зачем вообще нужна проверка, если хук привязан к окну?
Вот активное окно какого-нибудь приложения и я нажимаю комбинацию клавиш. Вместо того, чтобы отрисовать это окно поверх всех окон, отрисовывается какое-то постороннее окно. А иногда и не отрисовывается, но выполнение кода до туда доходит. При этом зачастую заголовок окна пустой. Spy по хэндлу окна тоже показывает пустой заголовок.
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 30.11.2015, 15:42   #4
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

Решил проблему установкой хука WH_SHELL вместо WH_CBT.
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Старый 30.11.2015, 17:21   #5
taras-proger
Подтвердите свой е-майл
 
Регистрация: 12.11.2014
Сообщений: 470
По умолчанию

Цитата:
Сообщение от Sam Gold Посмотреть сообщение
Необходимо по нажатию комбинации клавиш отображать активное в данный момент окно поверх всех окон.
А оно вообще способно отображаться под ними? Тогда что курили мелкомякие?
taras-proger вне форума Ответить с цитированием
Старый 30.11.2015, 19:23   #6
Sam Gold
Форумчанин
 
Аватар для Sam Gold
 
Регистрация: 26.03.2010
Сообщений: 538
По умолчанию

Цитата:
Сообщение от taras-proger Посмотреть сообщение
А оно вообще способно отображаться под ними? Тогда что курили мелкомякие?
Когда фокус теряется, то -да.
В моем вопросе имелось ввиду, что даже после потери фокуса выбранное окно должно отображаться поверх всех.
Единственный способ стать умнее - играть с более умным противником.
Sam Gold вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему на ряду со всеми, не срабатывает hot key "F12" KBO Помощь студентам 12 29.10.2015 23:21
Hot Key в ToolBar Impuls1989 Общие вопросы Delphi 7 13.10.2009 11:05
Hot Key для проги -=<[Evklidd]>=- Общие вопросы Delphi 17 19.04.2009 16:24
Отрисовка компонентов окна AXiUS Фриланс 1 28.01.2009 20:51
Отрисовка компонентов окна AXiUS Компоненты Delphi 0 28.01.2009 06:41