2017-10-07 12 views
0

이 int32하고 나는 거의 모든 gethashcode()를KeyEventArgs.Modifier 나는 사용자 정의 단축키를 가지고 프로그램을 만들고있어

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 that e.Modifiers.GetHashCode()는 다중 변경자에 대해 131072 (ctrl), 65536 (alt), 262144 (shift) 또는 이러한 조합의 합계를 반환합니다. GetHashCode()에서 (수정 자 외에) 다른 모든 키는 올바른 값을 반환하며 아무런 문제가 없습니다.

코드는

에 도달 할 때
private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk); 
는 항상 131072 그것은 코드에서이 다른 모든 로직을 기대하는 것입니다 무엇인지 않기 때문에 수정과 단축키를 등록 할 수 없게됩니다

는 소리와 것 (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 
); 

작품을 완벽하게 야호!