Господа, я столкнулся с такой неприятной проблемкой...
При установки горячей клавиши следующим способом:
wHotkey = (WORD)SendDlgItemMessage(IDC_HOT_KEY,HKM_GETHOTKEY,0,0);
SendMessage(WM_SETHOTKEY,wHotkey,0);
Прога при нажатии на эту HotKey сначала активирует свое окно, если оно неактивно или восстанавливает, если свернуто.
У меня прога вообще сидит в трее с ShowWindow(SW_HIDE) при сворачивании.
Подскажите, как избежать активации окна, и сразу обработать нажатие HotKey без использования хуко, желательно.
Спасибо.
28.08.05 19:30: Перенесено модератором из 'C/C++' — Павел Кузнецов
Здравствуйте, Аноним, Вы писали:
А>RegisterHotKey должен помочь.
Но при использовании RegisterHotKey необходимо указывать как параметр
fsModifiers
[in] Specifies keys that must be pressed in combination with the key specified by the nVirtKey parameter in order to generate a WM_HOTKEY message. The fsModifiers parameter can be a combination of the following values: Value Description
MOD_ALT Either ALT key must be held down.
MOD_CONTROL Either CTRL key must be held down.
MOD_KEYUP Both key up events and key down events generate a WM_HOTKEY message.
MOD_SHIFT Either SHIFT key must be held down.
MOD_WIN Either WINDOWS key was held down. These keys are labeled with the Microsoft Windows logo.
а я не знаю, какие клавиши указал пользователь, как выкрутиться?
Здравствуйте, Odi$$ey, Вы писали:
OE>у тебя же есть числовое значение хоткея, дальше — http://gzip.rsdn.ru/?article/mfc/QnAhotkeys.xmlАвтор(ы): Алексей Кирюшкин
Дата: 28.10.2004
Как использовать в своей программе "горячие клавиши"? Какой обработчик вызывать и что вписывать в карту сообщений?
Спасибо всем огромное. Разобрался.
Решение таково:
На нажатие кнопки, например с названием "Set HotKey":
wHotkey =(WORD) SendDlgItemMessage(IDC_HOT_KEY,HKM_GETHOTKEY,0,0); //получаем HotKey от конрола
m_nIDHotKey = GlobalAddAtom("HotCDOpen"); //во избежание конфликтов
TRACE("HotCDOpen = %d\n", m_nIDHotKey);
RegisterHotKey(m_hWnd,m_nIDHotKey,HIBYTE(wHotkey),LOBYTE(wHotkey)); //Регистрируем клавиши
Далее добавляем обработчик сообщения WM_HOTKEY:
BEGIN_MESSAGE_MAP(CHotCDOpenDlg, CDialog)
...
//}}AFX_MSG_MAP
ON_MESSAGE(WM_HOTKEY, OnHotKey)
...
END_MESSAGE_MAP()
И обрабатываем сообщение:
LRESULT CHotCDOpenDlg::OnHotKey(WPARAM wParam,LPARAM lParam)
{
TRACE(_T("CHotCDOpenDlg::OnHotKey\n"));
if (wParam==m_nIDHotKey)
{
CHotCDOpenDlg::OnBnClickedOpenBtn();
}
return 0;
}