热键覆盖

时间:2008-10-10 19:11:01

标签: c# c++ keyboard-shortcuts policy hotkeys

难题。答案可能是否定的,如果我在Intertubes中找到的所有内容都是正确的,但值得一试。我需要覆盖 Ctrl + Shift + Esc Ctrl + Esc 组合。能够覆盖 Win 组合键是一件好事,但我有一个低级别的钩子就是这样,我只希望我不需要它。如果我可以设法完全按策略阻止开始菜单和任务管理器,则不再需要覆盖,但我找不到正确的策略。

3 个答案:

答案 0 :(得分:1)

您可以覆盖 Ctrl + Esc (我刚试过AutoHotkey,它可以工作),但不能 Ctrl + Shift < / kbd> + Esc ,不超过 Ctrl + Alt + Del

所以使用政策可能是要走的路......我担心没有这个领域的经验。

答案 1 :(得分:0)

如果有人来这里寻找非AutoHotKey,这是一个c#方式。

可以使用键盘钩子来完成此操作。可以在CodeProject Article

上找到一个好的钩子类

使用以下代码可防止发生 WIN + LEFT WIN + RIGHT 。您可以使用它来覆盖您想要的任何键。

这甚至会覆盖您通过HookManager Win API添加的热键。

在项目中拥有这些类之后,您可以将处理程序添加到静态//It's worth noting here that if you subscribe to the Key_Press event then it will break the international accent keys. HookManager.KeyPress += HookManager_KeyPress; HookManager.KeyDown += HookManager_KeyDown; HookManager.KeyUp += HookManager_KeyUp; 类,如下所示。

KeyUp

您还可以添加鼠标事件,但为简单起见,我只是显示键盘钩子。

我还创建了一个通用列表,以便我知道哪些键当前已关闭,并从public static List<Keys> keysDown = new List<Keys>(); private static void HookManager_KeyDown(object sender, KeyEventArgs e) { //Used for overriding the Windows default hotkeys if(keysDown.Contains(e.KeyCode) == false) { keysDown.Add(e.KeyCode); } if (e.KeyCode == Keys.Right && WIN()) { e.Handled = true; //Do what you want when this key combination is pressed } else if (e.KeyCode == Keys.Left && WIN()) { e.Handled = true; //Do what you want when this key combination is pressed } } private static void HookManager_KeyUp(object sender, KeyEventArgs e) { //Used for overriding the Windows default hotkeys while(keysDown.Contains(e.KeyCode)) { keysDown.Remove(e.KeyCode); } } private static void HookManager_KeyPress(object sender, KeyPressEventArgs e) { //Used for overriding the Windows default hotkeys } public static bool CTRL() { //return keysDown.Contains(Keys.LShiftKey) if (keysDown.Contains(Keys.LControlKey) || keysDown.Contains(Keys.RControlKey) || keysDown.Contains(Keys.Control) || keysDown.Contains(Keys.ControlKey)) { return true; } else { return false; } } public static bool SHIFT() { //return keysDown.Contains(Keys.LShiftKey) if (keysDown.Contains(Keys.LShiftKey) || keysDown.Contains(Keys.RShiftKey) || keysDown.Contains(Keys.Shift) || keysDown.Contains(Keys.ShiftKey)) { return true; } else { return false; } } public static bool WIN() { //return keysDown.Contains(Keys.LShiftKey) if (keysDown.Contains(Keys.LWin) || keysDown.Contains(Keys.RWin)) { return true; } else { return false; } } public static bool ALT() { //return keysDown.Contains(Keys.LShiftKey) if (keysDown.Contains(Keys.Alt)) { return true; } else { return false; } } 事件列表中删除这些键。

{{1}}

答案 2 :(得分:-2)

所以你需要在应用程序上覆盖热键吗? 然后答案可能是肯定的,怎么样? 不知道,但如果这个(http://www.inchwest.com/mapkeyboard.aspx)程序可以,那么你可以