【问题标题】:Handling key strokes when window not focused/active窗口未聚焦/活动时处理击键
【发布时间】:2013-03-10 00:47:15
【问题描述】:

我需要在 WinAPI 中处理组合键 (CTRL+SHIFT+UP),即使窗口没有聚焦/处于活动状态。

我该怎么做(如果可能,我更喜欢不使用WinApi Hooks 的解决方案)?

【问题讨论】:

  • 使用 RegisterHotKey()。
  • 如果我想在另一个应用程序中使用 Ctrl+Shift+Up 怎么办?例如在 Word 中选择上一个段落。

标签: winapi window focus keystroke accelerator


【解决方案1】:

首先,您需要使用RegisterHotKey 函数注册“系统范围”热键。即使您的应用程序已最小化、未聚焦或隐藏,它也能正常工作。

RegisterHotKey(hWnd, KEY_ID, MOD_CONTROL | MOD_SHIFT, VK_UP);
// check for errors, the function will fail if the hot key is already registered

hWnd 是接收 WM_HOTKEY 消息的窗口句柄。 KEY_ID 是热键的标识符。 MOD_CONTROL | MOD_SHIFT 用于 Ctrl+Shift。 VK_UP 向上箭头键。

其次,您需要在窗口过程中处理 WM_HOTKEY 消息。

LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
    switch (uMsg) {
        ...
        WM_HOTKEY:
        // handle the hot key here
        ...
    }
}

如果您的应用程序没有窗口并且hWnd 为 NULL,那么您需要在消息循环中处理 WM_HOTKEY。

MSG msg = {0};
while (GetMessage(&msg, NULL, 0, 0) != 0)
{
    if (msg.message == WM_HOTKEY) {
        // handle the hot key here
    }
} 

【讨论】:

  • 很好的答案,更好的是您包括检查错误的需要。 +1
猜你喜欢
  • 2017-07-14
  • 1970-01-01
  • 2018-08-13
  • 1970-01-01
  • 2016-12-07
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 2019-06-16
相关资源
最近更新 更多