簡體   English   中英

熱鍵覆蓋

[英]Hotkeys override

難題。 如果我在Intertubes中發現的所有內容都是正確的,答案可能是否定的,但這值得一試。 我需要覆蓋Ctrl + Shift + EscCtrl + Esc組合。 能夠覆蓋Win組合鍵會很好,但是我有一個執行此操作的低級鈎子,我只希望自己不需要它。 如果我可以通過策略完全阻止開始菜單和任務管理器,則將不再需要覆蓋,但是我找不到正確的策略來執行此操作。

您可以覆蓋按Ctrl + Esc鍵 (我只是嘗試在AutoHotkey的,它的工作原理),而不是按Ctrl + Shift + Esc鍵 ,不超過按Ctrl + Alt + Del

因此,使用策略可能是要走的路。。。恐怕沒有該領域的經驗。

萬一有人來這里尋找非AutoHotKey,這是ac#方式。

可以使用鍵盤掛鈎執行此操作。 可以在此CodeProject文章上找到一個很好的鈎子類。

使用下面的代碼將防止WIN + LEFTWIN + RIGHT發生。 您可以使用它來覆蓋您想要的任何鍵。

這甚至會覆蓋通過RegisterHotKey Win 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;
            }
        }

因此,您需要在應用程序上覆蓋熱鍵嗎? 那么答案可能是肯定的,如何? 不知道,但是如果這個程序( http://www.inchwest.com/mapkeyboard.aspx )可以,那么您也可以

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM