使用键盘输入的修改器注册热键

时间:2015-08-24 09:47:02

标签: c# winforms hotkeys

我正在创建一个C#Windows窗体应用程序,其中有一个按钮,用于为用户提供的输入注册热键。

在按下之前:

按下后:

没有修饰符它工作正常,我正在接受输入,取消注册旧热键并使用我从用户那里获得的密码注册新热键。

现在Form1_KeyUp也提供了修饰符,读取它们也很好但是当我尝试使用给定的修饰符注册新的热键时它不起作用,可能是因为RegisterHotkey()使用了不同的“格式” “对于热键。因此,实际问题是:如何将KeyUp事件中给出的修饰符转换为RegisterHotkey()中可以使用的格式?

继承我的代码:

private void Form1_KeyUp(object sender, KeyEventArgs e)
{
    if (buttonHotkeyWaiting)
    {
        if (e.KeyCode == Keys.Escape)
            buttonHotkey.Text = (new KeysConverter()).ConvertToString(S_HOTKEY);
        else
        {
            S_HOTKEY = (int)e.KeyCode;
            S_HOTKEY_MODS = (int)e.Modifiers;

            string modString = (new KeysConverter()).ConvertToString(e.Modifiers);
            buttonHotkey.Text = modString.Substring(0, modString.Length - 4) + (new KeysConverter()).ConvertToString(S_HOTKEY);

            UnregisterHotKey(this.Handle, 1);
            RegisterHotKey(this.Handle, 1, S_HOTKEY_MODS, S_HOTKEY);

            MessageBox.Show(S_HOTKEY_MODS.ToString());
        }

        Cursor.Show();
        buttonHotkeyWaiting = false;
    }
}

1 个答案:

答案 0 :(得分:2)

您可以尝试将修饰符信息转换为user32.dll使用的整数:

int mod = 0;
if (e.Alt) mod |= 1;
if (e.Control) mod |= 2;
if (e.Shift) mod |= 4;
RegisterHotKey(this.Handle, 1, mod, S_HOTKEY);