Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Глобальные горячие клавиши

41K
11 июня 2011 года
oshilan
24 / / 15.11.2009
Например. Имеется моя программа - плейр. И когда окно плейра не активно, нужно, чтобы ним можно было управлять посредством некоторых клавиш, работая в других программах. Но эти клавиши блокируются в других программах и работают только в моей. Например, запустил я плейр, открыл Блокнот и печатаю там текст, и при нажатии горячей клавиши ('e' код=69) плейр отреагировал как надо, но вот только в блокноте буквы 'e' нету. Просьба исправить текст программы ниже или помочь советом ;)
Код:
#include<windows.h>
HINSTANCE hInst;
HWND hWnd;

LRESULT CALLBACK WndProc(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)
{ switch(Msg)
  { case WM_HOTKEY:
      switch(HIWORD(lParam))
      { case 69: //при нажатии Е всплывает окошко
          MessageBox(hWnd,L"Тест",L"ОК",MB_OK);
          break;
      }
      break;
    case WM_CREATE:
      RegisterHotKey(hWnd,25,0,69); //зарегистрировал "горячую клавишу" в системе
      break;
    case WM_DESTROY:
      PostQuitMessage(0);
      break;
    default:
      return(DefWindowProc(hWnd,Msg,wParam,lParam));
  }
}

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE,LPSTR,int)
{ MSG Msg;
  WNDCLASS wc;
  ZeroMemory(&wc,sizeof(WNDCLASS));
  wc.lpfnWndProc=WndProc;
  wc.lpszClassName=L"MainWnd";
  wc.hInst=hInst;
  RegisterClass(&wc);
  hWnd=CreateWindow(L"MainWnd",L"ZZZ",WS_OVERLAPPEDWINDOW|WS_VISIBLE,0,0,100,100,NULL,NULL,hInst,NULL);
  while(GetMessage(&Msg,0,0,0))
    DispatchMessage(&Msg);
  return 0;
}
14
11 июня 2011 года
Phodopus
3.3K / / 19.06.2008
хоткей, на то и хоткей чтобы при печатании банального текста в блокноте не происходила всякая хрень с другими программами
278
11 июня 2011 года
Alexander92
1.1K / / 04.08.2008
Хотите то, что вам нужно, - делайте через глобальные хуки.
7
11 июня 2011 года
@pixo $oft
3.4K / / 20.09.2006
А тебе надо такое,чтобы при печати текста в блокноте/асечке/етс. плеЕр реагировал?НЕ думаю,что это будет очень весело
41K
11 июня 2011 года
oshilan
24 / / 15.11.2009
2 Alexander92: можете реализовать сказанное на моём тексте? Буду очень признателен :)
278
11 июня 2011 года
Alexander92
1.1K / / 04.08.2008
Почитай про SetWindowsHookEx(). Если коротко, тебе нужно создать DLL, содержащую процедуру обработки клавиатурных событий, которая выглядит примерно так:
Код:
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM) {
  if (code < 0)
    return CallNextHookEx(hHook /* дескриптор хука */, code, wParam, lParam);

  if (code == HC_ACTION) {
    if (wParam == 'E') {  // Ура, нажали клавишу 'E'
      // здесь собственно обработка
    }
  }

  return CallNextHookEx(hHook, code, wParam, lParam); // передать вызов дальше по цепочке
}


Соответственно, из кода потом устанавливаешь хук и передаешь в качестве параметра hInstance модуль твоей подгруженной библиотеки.

P.S. @pixo $oft-то хороший вопрос задал. Что скажешь по этому поводу?
41K
12 июня 2011 года
oshilan
24 / / 15.11.2009
Спасибо! Я не собираюсь делать плеер. В самом начале я привел плеер в кач-ве примера :)
7
12 июня 2011 года
@pixo $oft
3.4K / / 20.09.2006
Даже если не плеер.Тебе нужны частые ложные срабатывания программы?

Приведу пример из жизни:есть такие программы,как Download master и MathCAD.В 1й есть несколько комбинаций для управления закачками,в т.ч. Shift+Ctrl+P,которая ставит закачку на паузу.В MathCAD же эта комбинация вставляет греческую букву «пи»(очень полезная штука).Я как раз набирал формулы и пару раз вызвал эту комбинацию,потом через некоторое время проверил закачки и(о ужас!) обнаружил,что они не работают–качал с летитбита,что ли
Представь,что будет,если в программе будет использоваться не какая-то трёхклавишная комбинация[COLOR="#c0c0c0"](аккорд =D)[/COLOR],а нечто более простое,что чаще можно нажать.Это ж ад будет!
316
12 июня 2011 года
Alm3n
889 / / 29.05.2009
@pixo $oft
он кейлогер, наверное, пишет. там нет ложных срабатываний :)
278
22 июня 2011 года
Alexander92
1.1K / / 04.08.2008
brodotsky, ай, какая порнография красивая получится. Я еще раз говорю: задача решается СТАНДАРТНЫМИ средствами через хуки. Не нужно искать левых путей, когда есть штатные и хорошо документированные.
278
22 июня 2011 года
Alexander92
1.1K / / 04.08.2008
Цитата: brodotsky
Не буду спорить с экспертом.



Я готов выслушать вас, если вы докажете, что ваше мнение правильное. Мое мнение обосновано тем, что _глобальная_ горячая клавиша на то и глобальная, что она регистрируется один раз в пределах всей системы. Если стоит задача привязать событие к конкретному окну (к чему приводится ваш вариант), эту задачу нужно решать в пределах конкретного приложения, вот и все. А способов поизвратиться действительно много, я не спорю.

278
22 июня 2011 года
Alexander92
1.1K / / 04.08.2008
Цитата: brodotsky
oshilan задал вопрос, как при помощи RegisterHotKey сделать горячую клавишу, работающую только внутри приложения.


Мне сдается, что вы неправильно поняли вопрос, перечитайте первый пост еще раз. Речь шла как раз о том, чтобы зарегистрировать глобальную горячую клавишу, только чтобы целевое приложение не перехватывало ее нажатие целиком, а после обработки передавало дальше по цепочке. Именно такой функционал благополучно реализован в механизме хуков.

584
22 июня 2011 года
brodotsky
33 / / 25.01.2004
Немного перепутал.

В случае с плеером и блокнотом нужно, чтобы на нажатие одной клавиши реагировали две программы.

А мне в какой-то моей программе нужно было добиться, чтобы горячая клавиша работала только при активном окне.

Так что спорить не о чем, мы, оказывается, говорили о разных вещах.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог