RegisterHotKey(this.Handle, 247696411, 0, (UInt32)Keys.***);

http://baike.baidu.com/view/1080084.html?tp=0_10 这里有RegisterHotKey
的介绍

RegisterHotKey 函数功能:该函数定义一个系统范围的热键。
函数原型:BOOL RegisterHotKey(HWND hWnd,intid,UINT fsModifiers,UINT vk);
参数:
hWnd:接收热键产生WM_HOTKEY消息的窗口句柄。若该参数NULL,传递给调用线程的WM_HOTKEY消息必须在消息循环中中进行处理。
id:定义热键的标识符。调用线程中的其他热键不能使用同样的标识符。应用功能程序必须定义一个0X0000-0xBFFF范围的值。一个共享的动态链接库(DLL)必须定义一个0xC000-0xFFFF范围的值伯GlobalAddAtom函数返回该范围)。为了避免与其他动态链接库定义的热键冲突,一个DLL必须使用GlobalAddAtom函数获得热键的标识符。
fsModifoers:定义为了产生WM_HOTKEY消息而必须与由nVirtKey参数定义的键一起按下的键。该参数可以是如下值的组合:
MOD_ALT:按下的可以是任一Alt键。MOD_CONTROL:按下的可以是任一Ctrl键。
MOD_SHIFT:按下的可以是任一Shift键。
MOD_WIN:按下的可以是任一Windows按键。这些键可以用Microsoft Windows日志记录下来。
vk:定义热键的虚拟键码。
返回值:若函数调用成功,返回一个非O值。若函数调用失败,则返回值为0。若要获得更多的错误信息,可以调用GetLastError函数。

API别忘了 using System.Runtime.InteropServices;

[DllImport("user32.dll")]
public static extern UInt32 RegisterHotKey(IntPtr hWnd, UInt32 id, UInt32 fsModifiers, UInt32 vk); //API

public Form1()
{
InitializeComponent();
RegisterHotKey(this.Handle, 247696411, 0, (UInt32)Keys.F10); //注册热键
} 阅读
//重写消息循环
protected override void WndProc(ref Message m)
{
const int WM_HOTKEY = 0x0312;
// m.WParam.ToInt32() 要和 注册热键时的第2个参数一样
if (m.Msg == WM_HOTKEY && m.WParam.ToInt32() == 247696411) //判断热键
{
//写上你的代码
}

base.WndProc(ref m);
}

写上代码后 只要 在程序运行时按F10就可以触发热键更改按键可以在 注册时改

2.

在应用中,我们可能会需要实现像Ctrl+C复制、Ctrl+V粘贴这样的快捷键,本文简单介绍了它的实现,并给出了一个实现类。
(1)建立一个类文件,命名为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
        }
    }
}

简单说明一下:
“public static extern bool RegisterHotKey()”这个函数用于注册热键。由于这个函数需要引用user32.dll动态链接库后才能使用,并且

user32.dll是非托管代码,不能用命名空间的方式直接引用,所以需要用“DllImport”进行引入后才能使用。于是在函数前面需要加上

“[DllImport("user32.dll", SetLastError = true)]”这行语句。
“public static extern bool UnregisterHotKey()”这个函数用于注销热键,同理也需要用DllImport引用user32.dll后才能使用。
“public enum KeyModifiers{}”定义了一组枚举,将辅助键的数字代码直接表示为文字,以方便使用。这样在调用时我们不必记住每一个辅

助键的代码而只需直接选择其名称即可。

(2)以窗体FormA为例,介绍HotKey类的使用

在FormA的Activate事件中注册热键,本例中注册Shift+S,Ctrl+Z,Alt+D这三个热键。这里的Id号可任意设置,但要保证不被重复。
private void Form_Activated(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);
}

在FormA的Leave事件中注销热键。
private void FrmSale_Leave(object sender, EventArgs e)
{
    //注销Id号为100的热键设定
    HotKey.UnregisterHotKey(Handle, 100);
    //注销Id号为101的热键设定
    HotKey.UnregisterHotKey(Handle, 101);// http://ike.126.com
    //注销Id号为102的热键设定
    HotKey.UnregisterHotKey(Handle, 102);
}

重载FromA中的WndProc函数
/// 
/// 监视Windows消息
/// 重载WndProc方法,用于实现热键响应
/// 
/// 
protected override void WndProc(ref Message m)
{
    const int WM_HOTKEY = 0x0312;//如果m.Msg的值为0x0312那么表示用户按下了热键
    //按快捷键 
    switch (m.Msg)
    {
        case WM_HOTKEY:
            switch (m.WParam.ToInt32())
            {
                case 100:    //按下的是Shift+S
                    //此处填写快捷键响应代码         
                    break;
                case 101:    //按下的是Ctrl+B
                    //此处填写快捷键响应代码
                    break;
                case 102:    //按下的是Alt+D
                    //此处填写快捷键响应代码
                    break;
            }
        break;
    }
    base.WndProc(ref m);
}

完成代码后,我们在窗体中按下Shift+S、Ctrl+B、Alt+D这三组快捷键中的任意一组时,程序都会做出响应的反应

C# 如何实现热键注册 RegisterHotKey相关推荐

  1. Windows热键注册(反汇编方法 查看win32api 原理)

    要像系统注册一个全局热键,需要用到RegisterHotKey,函数用法如下(MSDN): BOOL RegisterHotKey(                   HWND hWnd,      ...

  2. Delphi 全局热键注册+使用

    RAD Studio 10.2.3 测试√ 全局变量: varmHotKey01, mHotKey02: Integer; 1.在程序创建的时候或者窗体显示的时候注册热键 begin// 原子[mHo ...

  3. C# 系统热键注册代码

    为程序制定快捷键.很多软件都带热键功能的,通过以下方式可以实现2个键或3个键的快捷键. 先引用using System.Runtime.InteropServices; 的命名空间, 然后在合适的位置 ...

  4. linux下qt响应全局热键,Qt全局热键(windows篇)(使用RegisterHotKey和句柄进行注册)...

    Qt对于系统底层,一直没有很好的支持,例如串口并口通信,还有我们经常都会用到的全局热键,等等.既然Qt可能出于某种原因,不对这些进行支持,我们就只能自己写代码,调用系统相关的API了. 注意,这个是W ...

  5. 用RegisterHotKey注册系统热键

    函数功能:该函数定义一个系统范围的热键. 函数原型:BOOL RegisterHotKey(HWND hWnd,int id,UINT fsModifiers,UINT vk): 参数: hWnd:接 ...

  6. 远程注入dll中注册热键

    函数原型如下 BOOL RegisterHotKey( HWND hWnd, // handle to window int id, // hot key identifier UINT fsModi ...

  7. python3 全局热键_python3注册全局热键的实现

    之前用python3做游戏自动化脚本,用过很多东西,然后最终有一套完整的方案.在这里随便阐述一下核心思路: 游戏辅助的窗体设计方面: 不需要pyqt这种大型软件,写小工具用自带的tkinter就行了. ...

  8. python3注册全局热键

    之前用python3做游戏自动化脚本,用过很多东西,然后最终有一套完整的方案.在这里随便阐述一下核心思路: 游戏辅助的窗体设计方面: 不需要pyqt这种大型软件,写小工具用自带的tkinter就行了. ...

  9. 易语言- 定义一个系统范围的热键 RegisterHotKey UnregisterHotKey

    .版本 2 .DLL命令 UnregisterHotKey, 整数型, , "UnregisterHotKey"     .参数 hWnd, 整数型     .参数 HotKeyI ...

最新文章

  1. 在有序数字中寻找和为k的两个数 O(n)
  2. QT编译发布程序后报错如缺少dll、“应用程序无法正常启动(0xc000007b)”的可能解决方法
  3. 哈尔滨工业大学计算机学院官网,哈尔滨工业大学计算机学院 唐好选 tanghx@hope.hit...
  4. TRzCheckTree
  5. java asm 中文文档_Java ASM3学习(3)
  6. 信息学奥赛一本通(1218:取石子游戏)
  7. Springboot响应处理
  8. 图解深度学习-三种梯度下降法可视化(BGD,SGD,MBGD)
  9. eterm显示未连接服务器,eterm一直显示未链接服务器
  10. vue项目中引入vuex------初试
  11. 博士申请 | 南方科技大学NCC Lab刘泉影教授招收深度学习方向全奖博士生
  12. 关键字synchronized与volatile详解
  13. html肤质测试,皮肤致敏试验
  14. 共识算法-Mencius详解
  15. Linux系统日志管理
  16. 2048小游戏源代码
  17. 交换机tftp服务器修改ip,二、利用TFTP服务器恢复交换机配置.ppt
  18. 递归树求递归算法时间复杂度
  19. NodeJS使用socket传输大文件
  20. 笔记本电脑锁屏密码能输入,但解锁后键盘不好用

热门文章

  1. char*的vector数组pushback产生错误
  2. 华为自动驾驶 鸿蒙,华为高阶自动驾驶 + 华为鸿蒙 OS 车机系统体验
  3. nacos server 1.3 网盘地址
  4. JIFFIES——系统滴答
  5. 自动修复缺少的部分依赖关系
  6. 国仁网络:微信如何开通视频号;视频号运营教程指南大全。
  7. MATLAB截取图像特定区域
  8. cmd新建、删除文件和文件夹
  9. java按钮触发事件程序,小编给你传授java怎么实现按钮触发事件功能
  10. ios 制作手机端拼图游戏及衍生的其他内容