接到一个需求,如果焦点在程序内,则支持VK_NEXT翻页。
第一想法,是处理WM_KEYDOWN消息,发现是VK_NEXT则做相应的逻辑,但是程序内的界面太多了,每个界面都需要处理这个逻辑,显得不合适。
热键可以解决这个问题。热键能保证只要用户操作了注册的热键,就能收到窗口消息WM_HOTKEY。
热键的副作用就是会强占WM_KEYDOWN。
什么意思,就是原先会产生WM_KEYDOWN的VK_NEXT,如果被注册热键了,那么只能收到WM_HOTKEY,WM_KEYDOWN收不到了。
一种解决方法是,造一个WM_KEYDOWN,以避免影响其他程序。
case WM_CREATE: { //注册热键 g_hotkeyid = GlobalAddAtom(L"VK_LEFT") - 0xC000; RegisterHotKey(hWnd, g_hotkeyid, 0, VK_NEXT); } break; case WM_DESTROY: { //反注册热键 UnregisterHotKey(hWnd, g_hotkeyid); PostQuitMessage(0); } break; case WM_HOTKEY: { HWND focusWnd = GetForegroundWindow(); DWORD focusThreadId = GetWindowThreadProcessId(focusWnd, NULL); DWORD currentThreadId = GetCurrentThreadId(); if (focusThreadId == currentThreadId) { Draw(); } else { //吐出事件 PostMessage(focusWnd, WM_KEYDOWN, VK_NEXT, 0x01510001); PostMessage(focusWnd, WM_CHAR, VK_NEXT, 0x01510001); } }
实测对网页,visual studio等软件都运行良好。
但是对office软件无效,原因暂时不明。