我正在寻找一种允许用户为我的应用程序配置全局热键的方法。 目前我使用此代码注册全局热键:http://yuu.li/z4Qv9K
我的问题是,如何允许用户在运行时自定义热键? 我想到了,按一下Windows窗体按钮,然后按下你想要设置的热键。 但我需要在每个键盘上注册所有键以识别用户按下的键。
希望你理解我的意思,谢谢你:D
答案 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);
}