首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KeyEventArgs.Modifier到int32

KeyEventArgs.Modifier到int32
EN

Stack Overflow用户
提问于 2017-10-08 04:26:29
回答 1查看 191关注 0票数 0

我正在做一个程序,有用户可定制的热键,我有几乎所有的工作,除了一个小问题,转换修改键为int32使用gethashcode()

代码语言:javascript
复制
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;
}

我遇到的问题是,对于多修饰符,e.Modifiers.GetHashCode()返回131072(ctrl)、65536(alt)、262144(shift)或这些组合的任意和。我对(除了修饰符)执行GetHashCode()的任何其他键都会返回正确的值,没有任何问题。

当代码到达

代码语言:javascript
复制
private static extern bool RegisterHotKey(IntPtr hWnd, int id, int fsModifiers, int vk);

它总是无法使用修饰符注册热键,因为它不知道它期望的131072是什么2代码中的所有其他逻辑都是健全的,如果我尝试只注册(例如J键),它将正常工作

我不明白为什么会发生这样的事情,有没有办法简单的解决它呢?例如获取1,2,4,5,6,7 ( RegisterHotKey期望的适当修饰符)。我有一个想法,有点丑陋/笨重,比如

代码语言:javascript
复制
int32 _mod;

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

以此类推,对所有组合求和,这类似于我使用修饰符检查黑名单时所做的事情

另外,我很抱歉发表了非常奇怪的评论,我通常不评论代码,但我正在将整个程序推到github上,所以我试图对我所做的事情发表更多评论,这是我最少评论的空洞,因为我一直在修改它,试图修复它。

EN

回答 1

Stack Overflow用户

发布于 2017-10-08 06:13:33

我用的是什么

代码语言:javascript
复制
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}
};

用法:

代码语言:javascript
复制
Set_Hotkey(_sender_id, //id
 _mods.ContainsKey(e.Modifiers) ? _mods[e.Modifiers] : 0, //modifier
 e.KeyCode.GetHashCode() //vk
);

完美的工作耶!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46624777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档