【问题标题】:Configurable global keyboard hotkeys可配置的全局键盘热键
【发布时间】:2014-12-08 19:13:04
【问题描述】:

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

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

希望你明白我的意思,谢谢 :D

【问题讨论】:

  • 仅供参考:我没有点击那个链接,我相信很多其他人也不会。如果您要链接到某些内容,请将其设为受信任的站点并包含完整的 URL,而不是使用链接缩短器。
  • 有 100 万种更好的方式来传播恶意软件或类似的东西。点击链接或不点击,由你决定。
  • 无论链接的性质如何,我也不会点击,您应该在问题正文中包含代码。见How do I ask a good question?
  • @TrustedCreeper:我认为链接可能没问题,但您很快就可以将其更改为完整版。
  • 而且不会花你一秒钟来点击链接并查看它不是恶意软件...

标签: c# windows shortcut


【解决方案1】:

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);
}

【讨论】:

  • 非常好,感谢您的帮助。我会尝试实现这个:)
  • 漂亮干净的解决方案。但是,删除 HotKeyControl 后,我无法在设计器中重新打开表单,因为我收到“错误 HRESULT E_FAIL 已从对 COM 组件的调用中返回”。我正在使用带有 .NET 2.0 Windows 窗体项目的 Visual Studio 2015。
猜你喜欢
  • 1970-01-01
  • 2011-10-31
  • 1970-01-01
  • 2016-02-22
  • 2011-03-15
  • 2018-12-21
相关资源
最近更新 更多