当前位置: 首页 > news >正文

DOTA 快捷键助手

仅供娱乐。


软件界面:




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Diagnostics;


namespace DotaHelper
{
    public partial class FrmDotaHelper : Form
    {
        public FrmDotaHelper()
        {
            InitializeComponent();


        }


        public delegate int HookProc(int nCode, int wParam, IntPtr lParam);
        static int hHook = 0;
        public const int WH_KEYBOARD_LL = 13;
        //LowLevel键盘截获,如果是WH_KEYBOARD=2,并不能对系统键盘截取,Acrobat Reader会在你截取之前获得键盘。 
        private static HookProc KeyBoardHookProcedure;
        private static bool IsForbiddenWindows;
        //键盘Hook结构函数 
        [StructLayout(LayoutKind.Sequential)]


        public class KeyBoardHookStruct
        {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
            public int dwExtraInfo;
        }
        #region DllImport
        //设置钩子 
        [DllImport("user32.dll")]
        public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        //抽掉钩子 
        public static extern bool UnhookWindowsHookEx(int idHook);
        [DllImport("user32.dll")]
        //调用下一个钩子 
        public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);


        [DllImport("kernel32.dll")]
        public static extern int GetCurrentThreadId();


        [DllImport("kernel32.dll")]
        public static extern IntPtr GetModuleHandle(string name);
        //注册系统热键
        [DllImport("user32")]
        public static extern bool RegisterHotKey(IntPtr hWnd, int id, uint control, Keys vk);//注册热键
        [DllImport("user32")]
        public static extern bool UnregisterHotKey(IntPtr hWnd, int id);//解除热键
        [DllImport("user32")]
        public static extern void keybd_event(
                     byte bVk,
                     byte bScan,
                     uint dwFlags,
                     uint dwExtraInfo);//模拟键盘消息
        #endregion


        #region 目前小键盘7和9 only
        byte VK_NUM0 = 96;
        //byte VK_NUM1 = 97;
        //byte VK_NUM2 = 98;
        //byte VK_NUM3 = 99;
        //byte VK_NUM4 = 100;
        //byte VK_NUM5 = 101;
        //byte VK_NUM6 = 102;
        byte VK_NUM7 = 103;
        byte VK_NUM8 = 104;
        //byte VK_NUM9 = 105;
        #endregion


        #region 热键相关


        /// <summary>
        /// 注册热键
        ///     None = 0,
            //Alt = 1,
            //Ctrl = 2,
            //Shift = 4,
            //WindowsKey = 8
        /// </summary>
        /// <param name="handle">窗口句柄</param>
        public void RegisterHotKey()
        {




            把shift+Q设为快捷键,快捷键ID为1
            RegisterHotKey(Handle, 1, 4, Keys.Q);


            RegisterHotKey(Handle, 1, 4, Keys.D1);//把shift+1  设为快捷键




           // RegisterHotKey(Handle, 2, 0, Keys.W);
        }


        /// <summary>
        /// 取消注册热键
        /// </summary>
        /// <param name="handle">窗口句柄</param>
        public void UnRegisterHotKey()
        {
            UnregisterHotKey(Handle, 1);
           // UnregisterHotKey(Handle, 2);
           
        }


        protected override void WndProc(ref Message m)
        {
            switch (m.Msg)
            {
                case 0x0312:    //遇到了注册的快捷键ID为1,按下小键盘7
                    if (m.WParam.ToString().Equals("1"))
                    {
                        keybd_event(VK_NUM7, 0, 0, 0);//表示小键盘7键按下
                        keybd_event(VK_NUM7, 0, 0x7, 0);//小键盘7键弹起(先只做这一个格子的,基本够用了,一般都把跳刀放在这里)
                    }
                    //if (m.WParam.ToString().Equals("2"))
                    //{
                    //    keybd_event(VK_NUM0, 0, 0x8, 0);//表示9键按下
                    //    keybd_event(VK_NUM0, 0, 0x8, 0);//表示9键弹起
                    //}
                    break;
            }
            base.WndProc(ref m);
        }


        #endregion


        #region 钩子相关


        /// <summary>
        /// 开始挂钩
        /// </summary>
        public static void Hook_Start()
        {
            // 安装键盘钩子 
            if (hHook == 0)
            {
                KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);


                //hHook = SetWindowsHookEx(2, 
                //            KeyBoardHookProcedure, 
                //          GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), GetCurrentThreadId()); 


                hHook = SetWindowsHookEx(WH_KEYBOARD_LL,
                          KeyBoardHookProcedure,
                        GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
                //如果设置钩子失败. 
                if (hHook == 0)
                {
                    Hook_Clear();
                    //throw new Exception("设置Hook失败!"); 
                }
            }
        }
        //取消钩子事件 
        public static void Hook_Clear()
        {
            bool retKeyboard = true;
            if (hHook != 0)
            {
                retKeyboard = UnhookWindowsHookEx(hHook);
                hHook = 0;
            }
            //如果去掉钩子失败. 
            if (!retKeyboard) throw new Exception("UnhookWindowsHookEx failed.");
        }


        //这里可以添加自己想要的信息处理 
        public static int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
        {
            if (nCode >= 0)
            {
                KeyBoardHookStruct keys = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));


                if (keys.vkCode == 91 && IsForbiddenWindows)//屏蔽WINDOWS键
                {
                    return 1;
                }
                //if (keys.vkCode == (int)Keys.F4 &&
                //    ModifierKeys == Keys.Alt)//如果是ALT+F4
                //{
                //    return 1;
                //}
                //if (keys.vkCode == (int)Keys.Tab &&
                //    ModifierKeys == Keys.Alt)//如果是ALT+TAB
                //{
                //    return 1;
                //}


                return CallNextHookEx(hHook, nCode, wParam, lParam);
            }
            return CallNextHookEx(hHook, nCode, wParam, lParam);
        }


        #endregion


        private void btnStart_Click(object sender, EventArgs e)
        {
            if (btnStart.Text == "开始")
            {
                if (chkIsShortKey.Checked)
                {
                    this.RegisterHotKey();
                }
                Hook_Start();
                btnStart.Text = "结束";
            }
            else
            {
                if (chkIsShortKey.Checked)
                {
                    this.UnRegisterHotKey();
                }
                Hook_Clear();
                btnStart.Text = "开始";
            }
        }


        private void chkWindows_CheckedChanged(object sender, EventArgs e)
        {
            IsForbiddenWindows = true;
        }
    }
}


相关文章:

  • locale问题
  • C#网络爬虫与搜索引擎调研
  • Flex与.NET互操作(七):了解FluorineFx的环境配置(远程对象、网关、通道、目的地)...
  • 摘自《卓有成效的程序员》
  • vbscript脚本1-读取xml格式的配置文件
  • vbscript脚本2-实现include的办法
  • C# xml反序列化
  • C# 获得本地IP地址
  • [ListView.View=List]的垂直滚动条
  • C# html编码和文本的转换
  • 服务质量:电信无法回避的短板
  • C# 使用.NET性能计数器示例 绘制出正弦函数图像
  • 软件开发者面试百问
  • .net 4.0 A potentially dangerous Request.Form value was detected from the client 的解决方案
  • 情人节的礼物——书写是为了更好地思考——回应未鹏
  • #Java异常处理
  • 【面试系列】之二:关于js原型
  • exif信息对照
  • IDEA 插件开发入门教程
  • Java到底能干嘛?
  • Kibana配置logstash,报表一体化
  • PAT A1120
  • React Native移动开发实战-3-实现页面间的数据传递
  • React-生命周期杂记
  • swift基础之_对象 实例方法 对象方法。
  • VUE es6技巧写法(持续更新中~~~)
  • vue学习系列(二)vue-cli
  • 初识 webpack
  • 对象引论
  • 给Prometheus造假数据的方法
  • 记一次删除Git记录中的大文件的过程
  • 线上 python http server profile 实践
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • 栈实现走出迷宫(C++)
  • 找一份好的前端工作,起点很重要
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • #QT(一种朴素的计算器实现方法)
  • (3)STL算法之搜索
  • (附源码)springboot教学评价 毕业设计 641310
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (一)kafka实战——kafka源码编译启动
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .htaccess配置重写url引擎
  • .Net 6.0 处理跨域的方式
  • .net core 客户端缓存、服务器端响应缓存、服务器内存缓存
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .Net Winform开发笔记(一)
  • .NET 反射的使用
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net 验证控件和javaScript的冲突问题