2017-10-07 41 views
0

我做節目有用戶自定義的熱鍵和我有幾乎一切,除了1個順利工作轉換的組合鍵使用的GetHashCode()KeyEventArgs.Modifier到INT32

private void hotBox1_KeyDown(object sender, KeyEventArgs e) 
{ 
    string _senderName = ((TextBox)sender).Name; 
    int _sender_id = Convert.ToInt32(_senderName.Split(new[] { "hotBox" }, 
            StringSplitOptions.None)[1]) - 1; 

    Keys modifierKeys = e.Modifiers; 
    Keys pressedKey = e.KeyData^modifierKeys; 

    /* 
    * have to convert e.modifiers to 1/2/4/etc it's throwing errors when 
    * trying to register a new hotkey because it doesn't know what 131072 is 
    */ 

    /* 
    * OKAY so I rigged a bunch of stuff here I don't know why GetHashCode returns 
    * 131072 (20000 hex) for shift instead of 0x2 (2 dec) which is the hex code for 
    * shift modifier ??? 
    * Anyway I'm using the fixed values for detecting if shift/ctrl/alt or any 
    * combination is pressed to not block hotkey from blacklist with use of modifier 
    * I'm not very knowledgeable with that sort of stuff so feel free to edit to 
    * make more efficient 
    */ 

    Int32[] Modifiers = { 131072, 65536, 262144 }; //Control, Alt, Shift 

    /* 
    * BLACKLIST: ctrl+pgdn, ctrl+pgup, caps lock, tab, shift+all numpad (and all 
    * combinations of shift+{X}+num pad), F12, ctrl+shift{e,r,a,j} 
    * Q W E R T X D Z A ENT O C S L I H Y K N B U P G M space F8 F1 F 1 2 3 4 5 
    */ 

    Keys[] Blacklist = { Keys.Capital, Keys.CapsLock, Keys.F12, Keys.Tab, Keys.Q, 
         Keys.W, Keys.E, Keys.R, Keys.T, Keys.X, Keys.D, Keys.Z, 
         Keys.A, Keys.Enter, Keys.O, Keys.C, Keys.S, Keys.L, Keys.I, 
         Keys.H, Keys.Y, Keys.K, Keys.N, Keys.B, Keys.U, Keys.P, 
         Keys.G, Keys.M, Keys.Space, Keys.F8, Keys.F1, Keys.F, 
         Keys.D1, Keys.D2, Keys.D3, Keys.D4, Keys.D5 }; 

    foreach (Keys k in Blacklist) 
     if (k == pressedKey) 
      if (modifierKeys.GetHashCode() == Modifiers[0] || 
       modifierKeys.GetHashCode() == Modifiers[1] || 
       modifierKeys.GetHashCode() == Modifiers[2] || 
       modifierKeys.GetHashCode() == Modifiers[0] + Modifiers[1] || 
       modifierKeys.GetHashCode() == Modifiers[0] + Modifiers[2] || 
       modifierKeys.GetHashCode() == Modifiers[2] + Modifiers[1]) 
      { 
       //Console.WriteLine("No block"); //yes it finally works! 
      } 
      else 
      { 
       e.Handled = true; 
       e.SuppressKeyPress = true; 
       return; 
      } 

    if (e.KeyCode == Keys.Escape) 
     ((TextBox)sender).Parent.Focus(); 
    else if (pressedKey != Keys.ShiftKey && 
      pressedKey != Keys.Menu && 
      pressedKey != Keys.ControlKey && 
      pressedKey != Keys.None) 
      //pressedKey != Keys.None modifierKeys != Keys.None 
    { 
     Set_Hotkey(_sender_id, e.Modifiers.GetHashCode(), e.KeyCode.GetHashCode()); 
     ((TextBox)sender).Parent.Focus(); 
    } 
    else 
     ((TextBox)sender).Text = new KeysConverter().ConvertToString(e.Modifiers); 

    e.Handled = true; 
    e.SuppressKeyPress = true; 
} 

這個問題我來INT32 'm having是e.Modifiers.GetHashCode()返回131072(ctrl),65536(alt),262144(shift)或這些組合的任意總和用於多修飾符。我做任何其他的關鍵(除了修飾符)GetHashCode()返回正確的值,並沒有任何問題。

當代碼到達

private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk); 

它總是會失敗與改性劑註冊熱鍵,因爲它不知道131072是它的期待2中的所有其它邏輯代碼是無害,並能功能正常,如果我嘗試和註冊只是(J鍵)例如

我不明白爲什麼發生這種情況有無論如何解決它簡單?如獲得1,2,4,5,6,7(RegisterHotKey期望的適當修飾符)。我想到的東西是有點難看/與組合的所有款項笨重的像

int32 _mod; 

if (e.modifier.gethashcode() == 131072) 
    _mod = 2; 

等等等等這是類似什麼我做了黑名單與修飾

而且檢查,我對不起,我真的很奇怪評論我通常不評論代碼,但我推動整個程序github,所以我試圖評論更多我做的事情,這是我最少評論無效因爲我不斷修改它試圖解決它。

+0

兩件事:1)我重新格式化了您的代碼,以便我們不必水平滾動。你想要的是縮進嗎?在'foreach','if'和'else'語句周圍不使用大括號是不好的做法,並且可能會讓您的代碼更難以讀取和調試。 2)爲什麼你在項目上使用'GetHashCode()'來確定修飾符? 'Modifiers'屬性也返回'Keys'枚舉。 – krillgar

+0

@krillgar對不起,我會更頻繁地使用捲髮!謝謝你的提示。我試圖得到一個修飾符的整數表達式,所以我可以直接將它傳遞給RegisterHotKey(),我從閱讀某人的文章中找到關於熱鍵的文章,並且在所有目的中它都工作得很好,直到我到了這一點。我假設現在這是一個糟糕的選擇方法。現在我將所有虛擬鍵和修飾符都存儲爲變量和配置文件中的整數,以便保存用戶設置的熱鍵,以便它們在加載時準備好直接傳遞給RegisterHotKey() – Snowlove

+0

雖然'GetHashCode()'存在問題,散列碼的組合更多,而散列的可能性更大。例如,可以假定每個整數都有自己的散列碼。那麼這是什麼意思呢,如果你得到了'DateTime'或'string'的哈希碼?你會有一些重疊。當你試圖找出它的關鍵是什麼時,按照你所說的關鍵。 – krillgar

回答

0

去什麼
Dictionary<Keys, int> _mods = new Dictionary<Keys, int> { 
    { Keys.Alt, 1 }, 
    { Keys.Control, 2 }, 
    { Keys.Alt^Keys.Control, 3 }, 
    { Keys.Shift, 4 }, 
    { Keys.Alt^Keys.Shift, 5 }, 
    { Keys.Shift^Keys.Control, 6 }, 
    { Keys.Alt^Keys.Shift^Keys.Control, 7} 
}; 

用法:

Set_Hotkey(_sender_id, //id 
_mods.ContainsKey(e.Modifiers) ? _mods[e.Modifiers] : 0, //modifier 
e.KeyCode.GetHashCode() //vk 
); 

作品完美耶!

相關問題