这段时间项目有个需求,要在游戏全屏的时候禁用Alt+Tab等一类可以切换任务的快捷方式,也就是禁止玩家随意跳出游戏。
Google了一下资料,发现需要用到Hook,例子简单如下:http://topic.csdn.net/t/20040826/12/3311477.html
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
BOOL fEatKeystroke = FALSE;
if (nCode == HC_ACTION) {
switch (wParam) {
case WM_KEYDOWN:
case WM_SYSKEYDOWN:
case WM_KEYUP:
case WM_SYSKEYUP:
PKBDLLHOOKSTRUCT p = (PKBDLLHOOKSTRUCT) lParam;
fEatKeystroke =
((p-> vkCode == VK_TAB) && ((p-> flags & LLKHF_ALTDOWN) != 0)) ||
((p-> vkCode == VK_ESCAPE) && ((p-> flags & LLKHF_ALTDOWN) != 0)) ||
((p-> vkCode == VK_ESCAPE) && ((GetKeyState(VK_CONTROL) & 0x8000) != 0)) ||
( p-> vkCode == VK_LWIN) || (p-> vkCode==VK_RWIN )
;
break;
}
}
return (fEatKeystroke ? 1 : CallNextHookEx(NULL, nCode, wParam, lParam));
}
int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE, PTSTR pszCmdLine, int)
{
// Install the low-level keyboard & mouse hooks
HHOOK hhkLowLevelKybd = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hinstExe, 0);
// Keep this app running until we 're told to stop
MessageBox(NULL, TEXT( "Alt+Esc, Ctrl+Esc, Alt+Tab, LWIN and RWIN are now disabled.\n ")
TEXT( "Click \ "Ok\ " to terminate this application and re-enable these keys. "),
TEXT( "Disable Low-Level Keys "),
MB_OK);
UnhookWindowsHookEx(hhkLowLevelKybd);
return 0;
}
实际应用的时候,可以考虑把Hook主函数放到另外一个线程里运行(比如UE3的做法)