zoukankan      html  css  js  c++  java
  • [C#]使用API 获取设置系统热键和快捷键

         小颗豆的思路是:想要编一个小窗口程序,功能是打开某游戏后,按某个键然后鼠标自动重复点击游戏某个地方,再按某个键鼠标停止点击,这个问题涉及到全局键盘的捕获和释放,然后才是模拟鼠标(或键盘)按键
    第一部分:先说捕获键盘某键,即获取设置系统热键和快捷键
        首先引用空间为
    using System.Runtime.InteropServices;
        (一)第一种方法:
        先导入API:
            //注册热键的api
            [DllImport("user32")]
            public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint control, Keys vk);//注册热键的api(注意这里是返回逻辑值,参数为句柄,热键ID,组合键,键符)
            //解除注册热键的api
            [DllImport("user32")]
            public static extern bool UnregisterHotKey(IntPtr hWnd, int id);

        调用API:
    下边这段用于注册热键的两句可以放到某子程序先运行
                RegisterHotKey(this.Handle, 8888, 0, Keys.F4);//注册热键
                RegisterHotKey(this.Handle, 9999, 0, Keys.F5);
            //捕获键盘事件
            protected override void WndProc(ref Message m)
            {
                switch (m.Msg)
                {
                    case 0x0312:    //这个是window消息定义的   注册的热键消息
                        if (m.WParam.ToString().Equals("8888"))  //这是我们注册的那個热键
                        {
                            action();//开始工作自己去写......
                        }
                        if (m.WParam.ToString().Equals("9999"))
                        {
                            stop();//停止工作自己去写......
                        }               
                       break;
                }
                base.WndProc(ref m);
            }
        释放热键的语句可以放到formleaveg事件中去处理
            private void Form1_Leave(object sender, EventArgs e)
            {
                UnregisterHotKey(this.Handle, 888);//释放热键
                UnregisterHotKey(this.Handle, 999);
            }

        (二)第二种方法:
        导入API跟上边有点不同:
            [DllImport("user32.dll")]
            private static extern int RegisterHotKey(IntPtr hwnd, int id, int fsModifiers, int vk);(注意这里返回的是整数,参数略有不同:要定义热键的窗口的句柄,热键ID不能与其它ID重复,组合键(没有时为0),热键值)
            [DllImport("user32.dll")]
            private static extern int UnregisterHotKey(IntPtr hwnd, int id);
         调用API:
            /// <summary>
            /// 注册热键
            /// </summary>
            /// <param name="hwnd">窗口句柄</param>
            /// <param name="hotKey_id">热键ID</param>
            /// <param name="fsModifiers">组合键(没有为0)</param>
            /// <param name="vk">热键</param>
            public bool RegKey(IntPtr hwnd, int hotKey_id, int fsModifiers, int vk)
            {
                bool result;
                if (RegisterHotKey(hwnd, hotKey_id, fsModifiers, vk) == 0)//注册失败返回0
                {
                    result = false;
                }
                else
                {
                    result = true;
                }
                return result;
            }
            注销热键:
            public void UnRegKey(IntPtr hwnd, int hotKey_id)
             {
                UnregisterHotKey(hwnd, hotKey_id);
             }
    热键编号
    VK_ESCAPE = 27;//esc
    VK_UP = 38;//↑
    VK_DOWN = 40;//↓
    VK_LEFT = 37;//←
    VK_RIGHT = 39;//→
    ......
    组合键码:
    private const int MOD_ALT = 0x1; //ALT
    private const int MOD_CONTROL = 0x2; //CTRL
    private const int MOD_SHIFT = 0x4; //SHIFT
    private const int MOD_WIN = 0x8;//windows
        小结:感觉第二种还不如第一种方法方便.
    第二部分:模拟鼠标点击
        导入API:
            [DllImport("user32")]
            private static extern int mouse_event(int dwFlags, int dx, int dy, int cButtons, int dwExtraInfo);
            const int MOUSEEVENTF_MOVE = 0x0001;
            const int MOUSEEVENTF_LEFTDOWN = 0x0002;
            const int MOUSEEVENTF_LEFTUP = 0x0004;
            const int MOUSEEVENTF_RIGHTDOWN = 0x0008;
            const int MOUSEEVENTF_RIGHTUP = 0x0010;
            const int MOUSEEVENTF_MIDDLEDOWN = 0x0020;
            const int MOUSEEVENTF_MIDDLEUP = 0x0040;
            const int MOUSEEVENTF_ABSOLUTE = 0x8000;
        在某个子程序中调用即可(本例当然是放到时钟周期事件中即可)
                mouse_event(MOUSEEVENTF_MOVE, 0, 0, 0, 0); //移动鼠标,
                mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);//鼠标左键按下
                mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0);//鼠标左键抬起,注意按下,抬起才算一次单击
                //mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0);//鼠标右键按下
                //mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0);//鼠标右键抬起
    第三部分:模拟键盘
        就没这么复杂了,差不多就象下边这些语句了:
               textBox1.Focus();           //某控件得到焦点
               SendKeys.Send("^a");    //Ctrl+A
               SendKeys.Send("+(ab)");   //Shift+"ab"
               SendKeys.Send("+ab");    //Shift+'a'+'b'

               SendKeys.Send("{DEL}");   //Delete
                SendKeys.Send("{ENTER}");  //Enter
                SendKeys.Send("{a 10}");  //"aaaaaaaaaa"
    ...其它的慢慢去查.

  • 相关阅读:
    html的下拉框的几个基本使用方法
    中国大概能用的NTPserver地址
    index_ss hint 使用的运行计划变化对照
    sizeof,终极无惑(上)
    Android源代码学习之六——ActivityManager框架解析
    RelativeLayout经常使用属性介绍
    sharepoint 2013 个人网站公共母板页路径地址
    Binder机制1---Binder原理介绍
    Linux makefile 教程 很具体,且易懂
    虚拟短信
  • 原文地址:https://www.cnblogs.com/dooroo/p/RegisterHotKey.html
Copyright © 2011-2022 走看看