【问题标题】:How to circumvent the "foreground lock timeout" to activate my window?如何绕过“前台锁定超时”来激活我的窗口?
【发布时间】:2012-04-11 15:09:48
【问题描述】:

我正在尝试制作一个像 Launchy/Enso/etc. 这样的应用程序,当用户按下 Caps Lock 键时会弹出。

为此,我需要安装一个低级键盘钩子 (WH_KEYBOARD_LL),随后我从中生成一个线程来显示对话框以呈现给用户。

问题是,当我以某种方式窃取焦点(例如,通过单击另一个窗口)并随后短暂按下 Caps Lock 时,我的窗口没有得到键盘输入:输入转到后台窗口,即使我的窗口是“活动的”(通过查看标题栏)。

当然,这很烦人,因为我最终会在文本处理器(或聊天框...)中输入类似 "visu"(用于“Visual Studio”)之类的内容,然后按下 Enter 键,却没有意识到它没有达到我的预期。

(有趣的是,在 3 秒(左右)的暂停后,我的窗口标题栏突然变为“非活动”,即使它一开始从未处于活动状态!)

我怎样才能绕过这个“保护”机制来真正地激活我的窗口?

【问题讨论】:

  • Raymond Chen 在 Old New Thing 上对此进行了报道……您需要使用 shell 热键功能,而不是试图窃取焦点。
  • @BenVoigt:如何在抑制输入的同时使用 Caps Lock 做到这一点?
  • 我建议您从阅读雷蒙德的整个“军备竞赛”系列开始。 Here's the one I referred to already.
  • @BenVoigt:我已经阅读了那些......但就像我说的那样,这并没有告诉我如何在处理 Caps Lock 的同时正确地抑制它。

标签: c windows winapi timeout foreground


【解决方案1】:

好吧,我终于想出了一个技巧。 (微软雇主:请移开视线……)

我用低级键盘钩子拦截 Caps Lock,然后当我检测到VK_CAPITAL 时,我调用

keybd_event(
    VK_OEM_8,
    (BYTE)MapVirtualKey(pKBDLLHook->vkCode, MAPVK_VK_TO_VSC),
    (wParam == WM_KEYUP || wParam == WM_SYSKEYUP) ? KEYEVENTF_KEYUP : 0,
    0
);

从处理程序内部。

基本上,我只是将请求更改为VK_OEM_8
但是,请注意,虚拟键码对应于扫描码。这是故意的——VK_OEM_8 没有扫描码(据我所知,无论如何),所以我没有太多选择。

然后我只是基于VK_OEM_8 编写程序——这很容易拦截/处理/等等。

希望这对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 2021-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多