可配置的全局键盘热键

时间:2014-12-08 19:13:05

标签: c# windows shortcut

我正在寻找一种允许用户为我的应用程序配置全局热键的方法。 目前我使用此代码注册全局热键:http://yuu.li/z4Qv9K

我的问题是,如何允许用户在运行时自定义热键? 我想到了,按一下Windows窗体按钮,然后按下你想要设置的热键。 但我需要在每个键盘上注册所有键以识别用户按下的键。

希望你理解我的意思,谢谢你:D

1 个答案:

答案 0 :(得分:3)

Windows有一个built-in control。为这样的控件创建一个.NET包装器类非常容易。在项目中添加一个新类并粘贴下面显示的代码。编译。将新控件从工具箱顶部拖放到表单上。请注意,您可以在设计器中设置Hotkey属性。您只需添加一个“确定”按钮即可让用户更改其首选项。例如,将其保存在应用程序设置中。

using System;
using System.Drawing;
using System.Windows.Forms;

public class HotKeyControl : Control {
    public HotKeyControl() {
        this.SetStyle(ControlStyles.UserPaint, false);
        this.SetStyle(ControlStyles.StandardClick | ControlStyles.StandardDoubleClick, false);
        this.BackColor = Color.FromKnownColor(KnownColor.Window);
    }

    public Keys HotKey {
        get {
            if (this.IsHandleCreated) {
                var key = (uint)SendMessage(this.Handle, 0x402, IntPtr.Zero, IntPtr.Zero);
                hotKey = (Keys)(key & 0xff);
                if ((key & 0x100) != 0) hotKey |= Keys.Shift;
                if ((key & 0x200) != 0) hotKey |= Keys.Control;
                if ((key & 0x400) != 0) hotKey |= Keys.Alt;
            }
            return hotKey;
        }
        set { 
            hotKey = value;
            if (this.IsHandleCreated) {
                var key = (int)hotKey & 0xff;
                if ((hotKey & Keys.Shift)   != 0) key |= 0x100;
                if ((hotKey & Keys.Control) != 0) key |= 0x200;
                if ((hotKey & Keys.Alt)     != 0) key |= 0x400;
                SendMessage(this.Handle, 0x401, (IntPtr)key, IntPtr.Zero);
            }
        }
    }

    protected override void OnHandleCreated(EventArgs e) {
        base.OnHandleCreated(e);
        HotKey = hotKey;
    }

    protected override CreateParams CreateParams {
        get {
            var cp = base.CreateParams;
            cp.ClassName = "msctls_hotkey32";
            return cp;
        }
    }

    private Keys hotKey;

    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp);
}