C#中注册全局热键的几种方式

最近在用C#写项目,遇到了这个问题。便去网上查找了一番,在此整理备忘。
不得不说,作为微软爸爸创造的语言,果然是很方便。
虽然Python的语法总体上很简单,但是在注册全局热键这一块还是不如C#的,毕竟C#本来就是微软的东西,自家的东西自然要多多“照顾”。
下面开始贴代码:

第一种方法:自己动手,丰衣足食!

先在Winform项目中添加一个“类”,就叫Hotkey.cs吧

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace KoalaStudio.BookshopManager
{
    class HotKey
    {
        //如果函数执行成功,返回值不为0。
        //如果函数执行失败,返回值为0。要得到扩展错误信息,调用GetLastError。
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool RegisterHotKey(
            IntPtr hWnd,                //要定义热键的窗口的句柄
            int id,                     //定义热键ID(不能与其它ID重复)
            KeyModifiers fsModifiers,   //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效
            Keys vk                     //定义热键的内容
            );

        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool UnregisterHotKey(
            IntPtr hWnd,                //要取消热键的窗口的句柄
            int id                      //要取消热键的ID
            );

        //定义了辅助键的名称(将数字转变为字符以便于记忆,也可去除此枚举而直接使用数值)
        [Flags()]
        public enum KeyModifiers
        {
            None = 0,
            Alt = 1,
            Ctrl = 2,
            Shift = 4,
            WindowsKey = 8
        }
    }
}

不用多想,直接粘过去。需要理解的地方可以慢慢回味。

接下来修改窗体的OnLoad事件:

private void Form_OnLoad(object sender, EventArgs e)
{
    //注册热键Shift+S,Id号为100。HotKey.KeyModifiers.Shift也可以直接使用数字4来表示。
    HotKey.RegisterHotKey(Handle, 100, HotKey.KeyModifiers.Shift, Keys.S); 
    //注册热键Ctrl+B,Id号为101。HotKey.KeyModifiers.Ctrl也可以直接使用数字2来表示。
    HotKey.RegisterHotKey(Handle, 101, HotKey.KeyModifiers.Ctrl, Keys.B);
    //注册热键Alt+D,Id号为102。HotKey.KeyModifiers.Alt也可以直接使用数字1来表示。
    HotKey.RegisterHotKey(Handle, 102, HotKey.KeyModifiers.Alt, Keys.D);
}

这里调用之前写的类注册热键

注册了之后再窗体销毁时记得要取消注册,不然下次注册同样ID的热键时会出错

private void FrmSale_Leave(object sender, EventArgs e)
{
    //注销Id号为100的热键设定
    HotKey.UnregisterHotKey(Handle, 100);
    //注销Id号为101的热键设定
    HotKey.UnregisterHotKey(Handle, 101);
    //注销Id号为102的热键设定
    HotKey.UnregisterHotKey(Handle, 102);
}

既然设置了快捷键,那么我们分别要让它们对应干什么呢。绑定事件!
在Winform的主类中重写WndProc方法

protected override void WndProc(ref Message m)
{
    const int WM_HOTKEY = 0x0312;
    //按快捷键
    switch (m.Msg)
    {
        case WM_HOTKEY:
            switch (m.WParam.ToInt32())
            {
                case 100:    //按下的是Shift+S,对应之前注册热键时设置的ID
                    //此处填写快捷键响应代码,对应之前注册热键时设置的ID
                    MessageBox.Show("按下了Shift + S !");
                    break;
                case 101:    //按下的是Ctrl+B
                    //此处填写快捷键响应代码,对应之前注册热键时设置的ID
                    MessageBox.Show("按下了Control + B !");
                    break;
                case 102:    //按下的是Alt+D
                    //此处填写快捷键响应代码,对应之前注册热键时设置的ID
                    MessageBox.Show("按下了Alt + D !");
                    break;
            }
        break;
    }
    base.WndProc(ref m);
}

第一种方法完毕,大家赶紧试试吧!
由于是全局热键,只要程序开着,你在哪里按快捷键都有效
虽然看起来很麻烦,但是能收获到属于自己动手的那一份快乐。

说的好!我选择第二种方法。
……

第二种方法:不要重复造轮子!直接把别人整好的东西往里一扔不就好了

CSkin大家或许听说过,是个美化Winform的。虽然没有DSkin优秀,但是CSkin是免费的啊!
走,赶紧先去整到dll去
下载完毕后解压看到有一个2.0和一个4.0,根据自己解决方案的.Net Framework版本老老实实地选择。
接下来按照说明书上面的去做,下面贴出完整的“说明书”:

说明:
首先CSkin界面库是完全免费的,可以任意使用,并且代码中无任何限制,如果有其他问题或者想购买界面库源码的可以加我QQ:345015918。
文件夹中的2.0和4.0指的是netframework版本。
使用教程:
1.工具箱右键-新建项-命名CSkin。
2.将CSkin.dll拖到新建的工具箱栏里。
3.控件添加完毕,控件拖拽到界面即可使用和引用。
4.窗体美化需要继承CCSkinMain。
如:
public partial class FrmMain : Form
改成:
public partial class FrmMain : CCSkinMain
并且引用命名空间:
using CCWin;
5.窗体还可以继承以下等多种主题:
Skin_Color,Skin_DevExpress,Skin_Mac,Skin_Metro,Skin_VS
详细图解参考此帖:
http://bbs.cskin.net/thread-803-1-1.html
更多CSkin案例源码下载:
http://bbs.cskin.net/thread-800-1-1.html

已经写得明明白白得了,应该没问题。
按照上述步骤做完后,接着看
拖一个如图的控件出来,看到HotKey不由得欣喜若狂


这个控件和Timer一样,都是“看不见”的

看图说话:
注意我红色标出来的地方
Enabled记得改成True
在Key里面不要添加修饰符(键),会出错的

接下来添加事件。很简单

最后按下快捷键,成功弹出MessageBox


就是这么简单
由于也是全局热键,所以只要程序在运行,在哪里按快捷键程序都是会有反应的

以上就是注册全局热键的两种方法,请自行采纳使用

评论

  1. 3年前
    2019-3-25 18:31:48

    I like the valuable info you provide in your articles. I will bookmark your weblog and
    check again here regularly. I’m quite sure I’ll
    learn many new stuff right here! Good luck for the next! https://bocahickory.com/

  2. 3年前
    2019-4-01 2:02:53

    What’s up all, here every person is sharing these knowledge, thus
    it’s pleasant to read this web site, and I used to visit this webpage everyday. http://www.fourkrestaurant.com/

  3. Amy
    3年前
    2019-4-03 12:48:02

    Howdy would you mind letting me know which hosting company
    you’re working with? I’ve loaded your blog in 3 different web browsers and I must say this blog loads a lot quicker then most.

    Can you recommend a good internet hosting provider at a honest
    price? Kudos, I appreciate it! These are actually impressive ideas in on the topic of blogging.
    You have touched some fastidious points here. Any way keep up wrinting.
    I like it when folks come together and share ideas.
    Great website, keep it up! http://Cspan.Co.uk/

  4. 2年前
    2019-5-04 16:07:33

    Way cool! Some very valid points! I appreciate you writing this write-up and the rest of the website
    is also very good. https://bahastopikgosip2.blogspot.com/2018/09/kakak-syahrini-lakukan-hal-tak-biasa.html

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇