Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не отлавливаются горячие клавиши 
:(
    Опции темы
NovemberDreamer
Дата 2.9.2010, 06:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 1.9.2008

Репутация: нет
Всего: нет



Делаю в BCB трейнер для игры. Естественно, нужны горячие клавиши. Всё вроде нашёл, сделал, но! Они работают только когда игра находится в оконном режиме, стоит перевести её в полноэкранный и клавиши перестают ловиться. Как бы это исправить?

Вот код:
Код

void __fastcall TForm1::FormCreate(TObject *Sender)
{
// Регистрируем клавиши.
RegisterHotKey(hProcess,0,0,VK_F1); // Где hProcess - хэндл окна игры
}


void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
{
// Отлавливаем нажатия
if (Msg.message == WM_HOTKEY)
{
if (Msg.wParam == 0)
{
// Производим действие
}
}
}


Это сообщение отредактировал(а) NovemberDreamer - 2.9.2010, 06:49
PM MAIL   Вверх
Dem_max
Дата 2.9.2010, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



ловить сообщение WM_KEYDOWN, не забудь при этом в свойствах  главной формы сделать, Form1->KeyPreview = true;

P.S. да и не надо при этом регить горячие клавиши, все равно у тебя приложение в приоритетном фокусе ввода.

Это сообщение отредактировал(а) Dem_max - 2.9.2010, 10:25


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
NovemberDreamer
Дата 2.9.2010, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 1.9.2008

Репутация: нет
Всего: нет



Сделал так:
Код

void __fastcall TForm1::FormCreate(TObject *Sender)
{
Form1->KeyPreview = true;
}


void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg, bool &Handled)
{
// Отлавливаем нажатия
if (Msg.message == WM_KEYDOWN)
{
if (Msg.wParam == VK_F1)
{
// Производим действие
}
}
}

Но теперь клавиши отлавливаются только если форма в фокусе. Подозреваю, что что-то делаю не так.
PM MAIL   Вверх
ASMatic
Дата 2.9.2010, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 14.3.2009

Репутация: 1
Всего: 1



NovemberDreamer, 
Так ты изначально правильно все сделал, если тебе нужно отлавливать нажатие когда вне фокуса твоей формы. Только почему ты проверяешь wParam на 0??

Код

void __fastcall TForm1::FormCreate(TObject *Sender)
{
// Регистрируем клавиши.
RegisterHotKey(hProcess,0,0,VK_F1); // Где hProcess - хэндл окна игры
}
void __fastcall TForm1::ApplicationEvents1Message(tagMSG &Msg,
      bool &Handled)
{
// Отлавливаем нажатия
if (Msg.message == WM_HOTKEY)
{
if (Msg.wParam == IDHOT_SNAPWINDOW)
{
// Производим действие
}
}
}


Изначально есть мсдн
http://msdn.microsoft.com/en-us/library/ms...9(v=VS.85).aspx
 smile 

PM MAIL   Вверх
NovemberDreamer
Дата 3.9.2010, 05:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 1.9.2008

Репутация: нет
Всего: нет



0 - это id клавиши, присвоенный ей при регистрации. С того же msdn:
Код

BOOL WINAPI RegisterHotKey(
  __in_opt  HWND hWnd,
  __in      int id,
  __in      UINT fsModifiers,
  __in      UINT vk
);

В примере я просто немного сократил:
Код

void __fastcall TForm1::FormCreate(TObject *Sender)
{
RegisterHotKey(hProcess,0,0,VK_F1);
RegisterHotKey(hProcess,1,0,VK_F2);
RegisterHotKey(hProcess,2,0,VK_F3);
и т. д.
}

wParam - это идентификатор клавиши, сгенерировавшей сообщение. Сравнивая их, программа определяет нажатую клавишу.
Но если брать последний пример, то как форма узнает какую именно клавишу я нажал, ведь wParam проверяется на соответствие IDHOT_SNAPWINDOW, который, если я правильно понял, равен -1?

Это сообщение отредактировал(а) NovemberDreamer - 3.9.2010, 05:59
PM MAIL   Вверх
Dem_max
Дата 3.9.2010, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Цитата

Но теперь клавиши отлавливаются только если форма в фокусе


Ты же сам говоришь что приложение в полноэкранном режиме,а оно у тебя в фокусе по умолчанию уже.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
NovemberDreamer
Дата 3.9.2010, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 1.9.2008

Репутация: нет
Всего: нет



Не приложение (трейнер), а игра в полноэкранном режиме. Само приложение должно быть на заднем плане. В том-то и дело, что если игра запущена в окне, то моя программа работает нормально, но когда я переключаю игру в fullscreen, горячие клавиши перестают реагировать и очухиваются только если игру свернуть (естественно, при разворачивании игры они снова молчат).

Это сообщение отредактировал(а) NovemberDreamer - 3.9.2010, 16:44
PM MAIL   Вверх
ASMatic
Дата 3.9.2010, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 254
Регистрация: 14.3.2009

Репутация: 1
Всего: 1



Цитата(NovemberDreamer @  3.9.2010,  03:15 Найти цитируемый пост)
как форма узнает какую именно клавишу я нажал

VK_F1, VK_F2, VK_F3
PM MAIL   Вверх
NovemberDreamer
Дата 4.9.2010, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 1.9.2008

Репутация: нет
Всего: нет



Ну это-то понятно. Но вот где это указывается? Никак не могу сообразить. smile 
PM MAIL   Вверх
Dem_max
Дата 5.9.2010, 07:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Примерно так

Код

#define HOTKEYSHOW               1
WORD HotKey;

               BYTE VKey = LOBYTE(HotKey);
               BYTE KMod = HIBYTE(HotKey);
               BYTE KeyMod = 0;

               if(HOTKEYF_CONTROL & KMod){ KeyMod = KeyMod | MOD_CONTROL;}
               if(HOTKEYF_ALT     & KMod){ KeyMod = KeyMod | MOD_ALT;}
               if(HOTKEYF_SHIFT   & KMod){ KeyMod = KeyMod | MOD_SHIFT;}



RegisterHotKey(hWnd, HOTKEYSHOW, KeyMod, VKey)

 в частности может быть в итоге так или както подругому
RegisterHotKey(hWnd, 1, MOD_CONTROL, VK_F1)

      case WM_HOTKEY:
      {
         if(HOTKEYSHOW == (int)wParam)
         {
              действие
         }
      }break;




--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
NovemberDreamer
Дата 7.9.2010, 05:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 1.9.2008

Репутация: нет
Всего: нет



Сделал так, но результат тот же, что и был - работает, пока игра не займёт собой весь экран. Ладно, придётся сворачивать.
PM MAIL   Вверх
Dem_max
Дата 7.9.2010, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



используй DirectInput раз оно у тебя в FullScreen


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0533 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.