Глобальные горячие клавиши
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;
}
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-то хороший вопрос задал. Что скажешь по этому поводу?
Приведу пример из жизни:есть такие программы,как Download master и MathCAD.В 1й есть несколько комбинаций для управления закачками,в т.ч. Shift+Ctrl+P,которая ставит закачку на паузу.В MathCAD же эта комбинация вставляет греческую букву «пи»(очень полезная штука).Я как раз набирал формулы и пару раз вызвал эту комбинацию,потом через некоторое время проверил закачки и(о ужас!) обнаружил,что они не работают–качал с летитбита,что ли
Представь,что будет,если в программе будет использоваться не какая-то трёхклавишная комбинация[COLOR="#c0c0c0"](аккорд =D)[/COLOR],а нечто более простое,что чаще можно нажать.Это ж ад будет!
он кейлогер, наверное, пишет. там нет ложных срабатываний :)
Я готов выслушать вас, если вы докажете, что ваше мнение правильное. Мое мнение обосновано тем, что _глобальная_ горячая клавиша на то и глобальная, что она регистрируется один раз в пределах всей системы. Если стоит задача привязать событие к конкретному окну (к чему приводится ваш вариант), эту задачу нужно решать в пределах конкретного приложения, вот и все. А способов поизвратиться действительно много, я не спорю.
Мне сдается, что вы неправильно поняли вопрос, перечитайте первый пост еще раз. Речь шла как раз о том, чтобы зарегистрировать глобальную горячую клавишу, только чтобы целевое приложение не перехватывало ее нажатие целиком, а после обработки передавало дальше по цепочке. Именно такой функционал благополучно реализован в механизме хуков.
В случае с плеером и блокнотом нужно, чтобы на нажатие одной клавиши реагировали две программы.
А мне в какой-то моей программе нужно было добиться, чтобы горячая клавиша работала только при активном окне.
Так что спорить не о чем, мы, оказывается, говорили о разных вещах.