• C#定义热键和使用热键示例


    窗体定义热键,用一个文本框做定义,保存在文本文件中:文本框name:txt_hotkey

    文本框属性更改:ReadOnly=true;

    以下是文本框的需要的事件:

     private void txt_hotkey_KeyDown(object sender, KeyEventArgs e)
            {
                string control = "";
                string key = "";
                if (e.Modifiers.ToString() != "None")
                {


                    control = e.Modifiers.ToString().Replace(",", " +");
                    string keydata = e.KeyData.ToString().Substring(0, e.KeyData.ToString().IndexOf(","));
                    if (keydata == "Menu" || keydata == "ControlKey" || keydata == "ShiftKey")
                    {
                        key = "";
                        //key = e.Modifiers.ToString() + "|" + e.KeyData.ToString().Substring(0, e.KeyData.ToString().IndexOf(","));
                    }
                    else
                    {
                        key = e.KeyData.ToString().Substring(0, e.KeyData.ToString().IndexOf(","));
                        //key = e.Modifiers.ToString() + "|" + e.KeyData.ToString().Substring(0, e.KeyData.ToString().IndexOf(","));

                    }
                }
                else
                {
                    key = e.KeyData.ToString();
                }
                if (e.Modifiers.ToString() != "None")
                {
                    if (txt_hotkey.Text.Substring(txt_hotkey.Text.Length) == " ")
                    {
                        txt_hotkey.Text = "";
                    }
                    else
                    {
                        txt_hotkey.Text = control + " + " + key + "";
                    }
                }
                else
                {
                    if (txt_hotkey.Text.Substring(txt_hotkey.Text.Length) == " ")
                    {
                        txt_hotkey.Text = txt_hotkey.Text + "+" + key;
                    }
                    else
                    {
                        txt_hotkey.Text = key;
                    }
                }

                //txt_hotkey.Text= Func.Win32.KeyModifiers.Ctrl.ToString();


            }

            private void txt_hotkey_KeyUp(object sender, KeyEventArgs e)
            {
                if (txt_hotkey.Text.Length >= 1)
                {
                    if (txt_hotkey.Text.Substring(txt_hotkey.Text.Length - 1) == " ")
                    {
                        txt_hotkey.Text = "";
                    }
                }
            }

    定义完毕后保存事件:

      FileData file = new FileData(); //此类后面会介绍
                try
                {
                    file.WriteCom(txt_hotkey.Text);
                    Win32 win = new Win32();//定义注册热键的函数,后面会列出

                    win.regkey(Handle, 100, txt_hotkey.Text.Trim().Replace(" ", ""));//handle为要注册的窗体的Handle
                    win.regkey(Handle, 101, txt_Show.Text.Trim().Replace(" ", ""));
                }
                catch (Exception ee)
                {
                    file.WriteError("保存错误:" + ee.Message);
                }
                finally
                {
                    file = null;
                }

    以下为win32类定义:

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

    public class Win32
        {

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

            [DllImport("user32.dll",SetLastError=true)]
            public static extern bool RegisterHotKey(   IntPtr hWnd, //要定义热键的窗口的句柄  
                int id, //定义热键ID(不能与其它ID重复)  //标识热键是否在按Alt、Ctrl、Shift、Windows等键时才会生效
                int fsModifiers, 
                Keys vk //定义热键的内容  
                );

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

            /// <summary>
            /// 注册热键
            /// </summary>
            /// <param name="Handle">要注册热键的窗体句柄</param>
            /// <param name="id">注册的热键ID</param>
            /// <param name="hotkey">热键</param>

         public void regkey(IntPtr Handle,int id,string hotkey)
            {
                //FileData fd = new FileData();
                ////获取热键
                //string hotkey = fd.ReadHotKey();
                string[] keystr = hotkey.Split('+');
                if (keystr.Length > 0)
                {
                    Keys key = Keys.None;
                    int Modifiers = 0;
                    //注册热键Ctrl+Alt+0,Id号为100。KeyModifiers.CtrlAndAlt也可以直接使用数字3来表示。
                    KeysConverter kc = new KeysConverter();
                    if (keystr.Length == 2)
                    {
                        Modifiers = getkeycode(keystr[0]);
                        key = (Keys)kc.ConvertFromString(keystr[1]);
                    }
                    else if (keystr.Length == 3)
                    {
                        int Modifiers1 = getkeycode(keystr[0]);
                        int Modifiers2 = getkeycode(keystr[1]);
                        Modifiers = Modifiers1 + Modifiers2;
                        key = (Keys)kc.ConvertFromString(keystr[2]);
                    }
                    else
                    {
                        key = (Keys)kc.ConvertFromString(keystr[0]);
                    }
                    removekey(Handle, id);
                    if (!Func.Win32.RegisterHotKey(Handle, id, Modifiers, key))
                    {
                        MessageBox.Show("[" + hotkey + "]快捷键注册失败,可能已被其他程序占用,请更换或重试!");
                    }
                }
                else
                {
                    MessageBox.Show("没有设定快捷键或快捷键设定不正确!");
                }
            }
            public bool removekey(IntPtr Handle, int id)
            {
                return Func.Win32.UnregisterHotKey(Handle, id);
            }

            public int getkeycode(string key)
            {
                //None = 0,  
                //Alt = 1, 
                //Ctrl = 2, 
                //Shift = 4,  
                //WindowsKey = 8,  
                int keycode = 0;
                switch (key)
                {
                    case "Alt": keycode = 1; break;
                    case "Menu": keycode = 1; break;
                    case "Ctrl": keycode = 2; break;
                    case "Control": keycode = 2; break;
                    case "ControlKey": keycode = 2; break;
                    case "Shift": keycode = 4; break;
                    case "ShiftKey": keycode = 4; break;
                    case "WindowsKey": keycode = 8; break;
                    case "Windows": keycode = 8; break;
                    default: keycode = 0; break;
                }
                return keycode;
            }

    }

    FileData类,存储热键

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Collections;
    using System.IO;

    namespace Func
    {
        public class FileData
        {
            public FileData()
            { }

            public static string GetDirectory()
            {
                return System.AppDomain.CurrentDomain.BaseDirectory;
            }
            const string SPLIT = ",";
            const string FILENAME = "config.txt";

      //保存热键在配置文件中
            public bool WriteCom(string hotkey)
            {
                string path = GetDirectory() + FILENAMECOM;
                try
                {
                    FileStream stream = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write);
                    StreamWriter write = new StreamWriter(stream, Encoding.UTF8);
                    write.WriteLine( key1.Trim().Replace(" ", "") );
                    write.Close();
                    stream.Close();
                    return true;
                }
                catch (Exception ee)
                {
                    throw ee;
                }
            }

     //读取热键字符串
            public string ReadHotKey()
            {
                string path = GetDirectory() + FILENAMECOM;
                string HotKey = "";
                if (!File.Exists(path))
                    return HotKey;
                else
                {
                    FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read);
                    StreamReader reader = new StreamReader(stream, Encoding.UTF8);
                    //Model.Member m = null;
                    if (reader.Peek() > -1)
                    {
                        HotKey = reader.ReadLine(); 

                    }
                    reader.Close();
                    stream.Close();
                    return HotKey;
                }
            }

    以下为使用窗体代码:

    在窗体的构造函数中写入以下代码:

     Win32 win = new Win32();
                FileData file = new FileData();
                string key1 = file.ReadHotKey();
                if (key1!="")
                    win.regkey(Handle, (int)HotKeyID.read, key1);//HotKeyID为本人写的枚举

    重写使用窗体的以下事件:

     protected override void WndProc(ref Message m)
            {
                const int WM_HOTKEY = 0x0312;
                switch (m.Msg)
                {
                    case WM_HOTKEY:

                        switch (m.WParam.ToInt32())
                        {
                            case (int)HotKeyID.read:
                               // 这里写热键要执行的动作
                                break;

                        }
                        break;

                }
                base.WndProc(ref m);
            }

     以下补充为上述本人使用的枚举:

     public enum HotKeyID : int
        {
            read = 100
        }

  • 相关阅读:
    学习UML类图
    【转】监听器(Listener)学习
    【转】ContextLoaderListener和DispatcherServlet加载内容的区别
    个人B站+微信公众号
    如何直观形象地树状打印一棵二叉树?
    轻松手撕10大排序算法
    简单易懂的快速幂取模算法
    程序员必学:快速幂算法
    为什么Swift和Python要抛弃++--?
    JetBrains系列IDE的配色方案(IDEACLionPyCharm)
  • 原文地址:https://www.cnblogs.com/zhaoweiqiu/p/2314678.html
Copyright © 2020-2023  润新知