如何使用LowLevelKeyboardHook挂钩Win + Tab

简而言之:在Win + Tab之后阻塞Win会使Windows认为Win仍然下降,因此例如用Win键按下S将会打开search界面,而不是只input“s”…直到用户按下再次阻止它意味着Windows开始菜单将显示。 我遇到了一个难题


使用LowLevelKeyboardHook使用Alt + Tab ,或使用RegisterHotKey Win + Some Ubounded Key ,我没有任何困难。 只有使用LowLevelKeyboardHookWinLowLevelKeyboardHook

在下面的例子中,当Win + Tab组合被检测到时,我接pipeWin Win事件。 这导致每一个下面的按键行为就像Win键仍然closures一样。

  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); } } } 

您可以在这里find完整的代码(注意,它应该replace您的Program.cs在一个空的WinForms项目运行): https : //gist.github.com/christianrondeau/bdd03a3dc32a7a718d62 – 按Win + TabForm标题应该更新每次按下快捷键。

请注意,连接到此特定组合的目的是提供一个Alt + Tab替代选项,而不必replaceAlt + Tab本身。 提供使用Win + Tab启动自定义代码的答案也将被接受。

这是我的想法,为此我找不到文件。 所有可能成功回答我的问题。

  • 告诉Windows在没有实际触发的情况下“取消” Win
  • 防止Windows启动一次开始菜单
  • 直接在Windows的Win +事件挂钩,而不是手动挂钩到键盘(如果存在,这将是我的第一select)

Solutions Collecting From Web of "如何使用LowLevelKeyboardHook挂钩Win + Tab"

这似乎是做你想要的(如果你愿意,省略RWin)。

当您的应用程序失去焦点时,请体谅并取消注册此KB钩子!

  [DllImport("user32.dll")] static extern short GetAsyncKeyState(System.Windows.Forms.Keys vKey); private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode == HC_ACTION) { var keyInfo = (Kbdllhookstruct) Marshal.PtrToStructure(lParam, typeof (Kbdllhookstruct)); if ((int) wParam == WM_KEYDOWN && keyInfo.VkCode == VK_TAB && (GetAsyncKeyState(Keys.LWin) < 0 || GetAsyncKeyState(Keys.RWin) < 0)) { _mainForm.Text = "Win + Tab was pressed " + (++_winTabPressCounter) + " times"; return (IntPtr) 1; } } return CallNextHookEx(_hookID, nCode, wParam, lParam); } 

在发现这种技术之前,我尝试了几件事情。 这篇文章是最有用的https://stackoverflow.com/a/317550/55721

系统需要知道你释放的Windows键。 我检查了我自己的钩子谁没有这个问题的差异,唯一的区别是你和我的是这一行:

 if (_isWinTabDetected) { _isWinTabDetected = false; return (IntPtr)1; //THIS LINE }