当前位置:首页 > 开发 > C# > 正文内容

C# 热键

C#3年前 (2022-11-03)
API    
/// <summary>
/// 注册定义系统范围的热键。失败会设置GetLastError,如果GetLastError等于ERROR_HOTKEY_ALREADY_REGISTERED,表示热键被占用,
/// </summary>
/// <param name="hWnd">要定义热键的窗口的句柄</param>
/// <param name="id">定义热键ID,不能与其它ID重复</param>
/// <param name="fsModifiers">以MOD_开头的常量,标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效</param>
/// <param name="vk">定义的热键</param>
/// <returns></returns>
[DllImport("user32.dll", SetLastError = true)]
public static extern bool RegisterHotKey(IntPtr hWnd,int id, int fsModifiers,int vk );
/// <summary>
/// 注销以前由调用线程注册的热键。
/// </summary>
/// <param name="hWnd">要取消热键的窗口的句柄</param>
/// <param name="id">取消定义的热键ID</param>
/// <returns></returns>
[DllImport("user32.dll", SetLastError = true)]
public static extern bool UnregisterHotKey(IntPtr hWnd,int id);


常量    
/// <summary>
/// 1409-表示热键被占用
/// </summary>
public const int ERROR_HOTKEY_ALREADY_REGISTERED = 0x0581;
/// <summary>
/// 1-按住ALT键。
/// </summary>
public const int MOD_ALT = 0x0001;
/// <summary>
/// 2-按住CTRL键。
/// </summary>
public const int MOD_CONTROL = 0x0002;
/// <summary>
/// 16384-更改热键行为,长按键盘时不会产生多个热键通知。
/// </summary>
public const int MOD_NOREPEAT = 0x4000;
/// <summary>
/// 4-按住SHIFT键。
/// </summary>
public const int MOD_SHIFT = 0x0004;
/// <summary>
/// 8-按住WINDOWS键。这些键标有Windows徽标。涉及WINDOWS键的键盘快捷方式保留供操作系统使用。
/// </summary>
public const int MOD_WIN = 0x0008;
/// <summary>
/// 789-当用户按下由RegisterHotKey函数注册的热键时提交此消息
/// </summary>
public const int WM_HOTKEY = 0x0312;


使用    
        /// <summary>
        /// ↑键ID
        /// </summary>
        private const int keyUP = 65536;
        /// <summary>
        /// →键ID
        /// </summary>
        private const int keyRight = 65537;
        /// <summary>
        /// ↓键ID
        /// </summary>
        private const int keyDown = 65538; 
        /// <summary>
        /// ←键ID
        /// </summary>
        private const int keyLeft = 65539;

        private void Form1_Load(object sender, EventArgs e)
        {
            hookkey.RegisterHotKey(this.Handle, keyUP, Cor.Constant.MOD_CONTROL | Cor.Constant.MOD_NOREPEAT ,(int) Keys.Up);
            hookkey.RegisterHotKey(this.Handle, keyRight, Cor.Constant.MOD_CONTROL, (int)Keys.Right);
            hookkey.RegisterHotKey(this.Handle, keyDown, Cor.Constant.MOD_CONTROL, (int)Keys.Down);
            hookkey.RegisterHotKey(this.Handle, keyLeft, Cor.Constant.MOD_CONTROL, (int)Keys.Left);
        }
        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            hookkey.UnregisterHotKey(this.Handle, keyUP);
            hookkey.UnregisterHotKey(this.Handle, keyRight);
            hookkey.UnregisterHotKey(this.Handle, keyDown);
            hookkey.UnregisterHotKey(this.Handle, keyLeft);
        }

        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);

            switch (m.Msg)

            {
                case Cor.Constant.WM_HOTKEY: 
                    switch (m.WParam.ToInt32())
                    {
                        case keyUP: //热键ID
                            MessageBox.Show("上");
                            break;
                        case keyRight: //热键ID
                            MessageBox.Show("右");
                            break;
                        case keyDown: //热键ID
                            MessageBox.Show("下");
                            break;
                        case keyLeft: //热键ID
                            MessageBox.Show("右");
                            break;
                        default:
                            break;
                    }
                    break;
            }
        }



转载请注明出处。

本文链接:http://pythonopen.com/?id=246

相关文章

C# 文件属性与转换为字节

获取文件属性    FileInfo fileInfo&nb...

C# 可空参数

using System; using System.Runtime.Inte...

C# BackgroundWorker

1.概述BackgroundWorker是一个在 WinForms 应用程序中用于简化在后台线程执行...

C# [OnPaint]和[OnPaintBackground]的区别

OnPaint和OnPaintBackground的主要功能区别OnPaint:OnPaint方法主...

C# double转为string并保留两位小数

在 C# 中,可以使用多种方式将 double 类型的数据转换为 string 类型并保留两位小数,...

C# BackgroundWorker的例子

以下是一个使用 BackgroundWorker 组件在 C# 中实现后台执行任务,同时在主线程更新...