简而言之:按下 Win + Tab 后阻止释放 Win 键,这会让 Windows 认为 Win 仍然被按下,所以例如松开 Win 键时按下 S 将打开搜索面板而不仅仅输入 "s"……直到用户再次按下 Win。如果不阻止它,则将显示 Windows 开始菜单。我很为难!
我没有问题去监听使用 Alt + Tab 的快捷键,可以使用
我没有问题去监听使用 Alt + Tab 的快捷键,可以使用
LowLevelKeyboardHook
或者 Win + 某个未绑定的键 快捷键,可以使用 RegisterHotKey
。问题只出现在使用 LowLevelKeyboardHook
监听 Win 键时。在下面的示例中,当检测到 Win + Tab 组合键时,我接管了 Win 键的弹起事件。这导致每个后续按键的行为都像 Win 键仍然被按下一样。 private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
if (nCode != HC_ACTION)
return CallNextHookEx(_hookID, nCode, wParam, lParam);
var keyInfo = (Kbdllhookstruct)Marshal.PtrToStructure(lParam, typeof(Kbdllhookstruct));
if (keyInfo.VkCode == VK_LWIN)
{
if (wParam == (IntPtr)WM_KEYDOWN) {
_isWinDown = true;
} else {
_isWinDown = false;
if (_isWinTabDetected) {
_isWinTabDetected = false;
return (IntPtr)1;
}
}
}
else if (keyInfo.VkCode == VK_TAB && _isWinDown) {
_isWinTabDetected = true;
if (wParam == (IntPtr)WM_KEYDOWN) {
return (IntPtr)1;
} else {
_isWinTabDetected = true;
Console.WriteLine("WIN + TAB Pressed");
return (IntPtr)1;
}
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);
}
}
}
请注意,完整的代码可以在此处找到(请注意,它应该替换空WinForms项目中的Program.cs
才能运行):https://gist.github.com/christianrondeau/bdd03a3dc32a7a718d62 - 按下 Win + Tab,每次按快捷键时Form
标题都会更新。
请注意,钩入此特定组合键的意图是提供一个Alt + Tab的替代方式,而不是要替换 Alt + Tab 本身。如果有回答提供使用 Win + Tab 启动自定义代码的能力,则也将被接受。
以下是我的一些想法,但我无法找到文档。所有这些想法都潜在地可以成功地回答我的问题。
- 告诉 Windows “取消” Win 的抬起事件而不实际触发它
- 防止 Windows 启动开始菜单一次
- 直接钩入Windows的Win+事件,而不是手动钩入按键(如果存在的话,这将是我首选)
MessageBox
,似乎MessageBox
会取消 Windows 菜单。我将更改示例,在Form1
中写入一些内容... - Christian Rondeau