0

困难的问题。答案可能是否定的,如果我在 Intertubes 中发现的一切都是正确的,但值得一试。我需要覆盖Ctrl++和Shift+组合。能够覆盖组合键会很好,但我有一个低级别的钩子可以做到这一点,我只希望我不需要它。如果我可以设法完全通过策略阻止开始菜单和任务管理器,则不再需要覆盖,但我找不到正确的策略来这样做。EscCtrlEscWin

4

3 回答 3

1

您可以覆盖Ctrl+ Esc(我刚刚在 AutoHotkey 中尝试过,它有效),但不能覆盖++ Ctrl,不超过Shift++ 。EscCtrlAltDel

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

于 2008-10-10T20:46:12.260 回答
0

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

可以使用键盘挂钩来执行此操作。可以在此 CodeProject 文章中找到一个很好的钩子类

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

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

在项目中拥有这些类后,您可以将处理程序添加到静态HookManager类,如下所示。

//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;
            }
        }
于 2017-04-09T16:51:13.707 回答
-2

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

于 2008-10-10T19:18:34.090 回答