当前位置: 移动技术网 > IT编程>开发语言>c# > C#全局热键设置与窗体热键设置实例

C#全局热键设置与窗体热键设置实例

2019年07月18日  | 移动技术网IT编程  | 我要评论
本文实例讲述了c#全局热键设置与窗体热键设置,分享给大家供大家参考。具体实现方法如下: 1、窗体热键 首先要设置主窗体keypreview为true,可直接在属性中进行

本文实例讲述了c#全局热键设置与窗体热键设置,分享给大家供大家参考。具体实现方法如下:

1、窗体热键

首先要设置主窗体keypreview为true,可直接在属性中进行设置,
或者在窗体加载中设置: this.keypreview = true;
然后添加窗体keydown事件,如下:

复制代码 代码如下:
private void frmmain_keydown(object sender, keyeventargs e)
{
    if (e.alt && e.shift && e.control && e.keycode == keys.s)
    {
 messagebox.show("我按了control +shift +alt +s");
    }
}

2、全局热键设置

定义api函数 》 注册热键 》 卸载热键

我这里定义了apphotkey类,全部代码如下:

复制代码 代码如下:
public class apphotkey
{
        [dllimport("kernel32.dll")]
        public static extern uint getlasterror();
        //如果函数执行成功,返回值不为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
        }
        /// <summary>
        /// 注册热键
        /// </summary>
        /// <param name="hwnd">窗口句柄</param>
        /// <param name="hotkey_id">热键id</param>
        /// <param name="keymodifiers">组合键</param>
        /// <param name="key">热键</param>
        public static void regkey(intptr hwnd, int hotkey_id, keymodifiers keymodifiers, keys key)
        {
            try
            {
                if (!registerhotkey(hwnd, hotkey_id, keymodifiers, key))
                {
                    if (marshal.getlastwin32error() == 1409) { messagebox.show("热键被占用 !"); }
                    else
                    {
                        messagebox.show("注册热键失败!");
                    }
                }
            }
            catch (exception) { }
        }
        /// <summary>
        /// 注销热键
        /// </summary>
        /// <param name="hwnd">窗口句柄</param>
        /// <param name="hotkey_id">热键id</param>
        public static void unregkey(intptr hwnd, int hotkey_id)
        {
            //注销id号为hotkey_id的热键设定
            unregisterhotkey(hwnd, hotkey_id);
        }
}

重写窗体的wndproc函数,在窗口创建的时候注册热键,窗口销毁时销毁热键,代码如下:

复制代码 代码如下:
private const int wm_hotkey = 0x312; //窗口消息-热键
private const int wm_create = 0x1; //窗口消息-创建
private const int wm_destroy = 0x2; //窗口消息-销毁
private const int space = 0x3572; //热键id
protected override void wndproc(ref message m)
{
    base.wndproc(ref m);
    switch (m.msg)
    {
 case wm_hotkey: //窗口消息-热键id
     switch (m.wparam.toint32())
     {
  case space: //热键id
      messagebox.show("我按了control +shift +alt +s");
      break;
  default:
      break;
     }
     break;
 case wm_create: //窗口消息-创建
     apphotkey.regkey(handle, space, apphotkey.keymodifiers.ctrl | apphotkey.keymodifiers.shift | apphotkey.keymodifiers.alt, keys.s);
     break;
 case wm_destroy: //窗口消息-销毁
     apphotkey.unregkey(handle, space); //销毁热键
     break;
 default:
     break;
    }
}

希望本文所述对大家的c#程序设计有所帮助。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网