魔兽改键程序修改

AutoHotkeyWarkey编制 认识和学习AutoHotkey还是因为Dota()。AutoHotkey能做什么呢?能做的太多了,有兴趣自己体会。下面谈谈用它如何制作Warkey,需要有点AutoHotkey基础,版权归AutoHotkey以及为之贡献的人所有,由本人理解拼凑。        显血就不说了,1.22之后版本可以勾选是否始终显血。主要就说下吧。先说不要GUI的,最直接的一种方法:q::Numpad7(小 阅读详情

前两天的改键程序修改后基本可用,贴代码

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace war3Keywizard
{
    static class SysMessageConst
    {
        public const int WM_KEYDOWN = 0x100;//按下消息
        public const int WM_KEYUP = 0x101;//松开消息
        public const int WM_SYSKEYDOWN = 0x104;
        public const int WM_SYSKEYUP = 0x105;
    }
    public class KeyboardHook
    {

        //构造函数中安装钩子
        public KeyboardHook()
        {
            Start();
        }
        //析构函数中卸载钩子
        ~KeyboardHook()
        {
            Stop();
        }

        static int hKeyboardHook = 0;
        //鼠标常量
        public const int WH_KEYBOARD_LL = 13;

        public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
        //声明键盘钩子事件类型
        HookProc KeyboardHookProcedure;

        //处理消息的函数 返回值  true:屏蔽消息 false:继续消息传递
        public delegate bool KeyValueWizardD(Int32 wParam);
        //按下键盘的处理
        public KeyValueWizardD keyDownvalWzard;
        //释放键盘的处理
        public KeyValueWizardD keyUpvalWizard;


        //安装钩子
        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        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 int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
        //卸载钩子
        [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
        public static extern bool UnhookWindowsHookEx(int idHook);
        [DllImport("kernel32")]
        public static extern int GetModuleHandle(string lpModuleName);



        public void Start()
        {
            if (hKeyboardHook == 0)
            {
                KeyboardHookProcedure = new HookProc(KeyboardHookProc);
                //hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, Marshal.GetHINSTANCE(System.Reflection.Assembly.GetExecutingAssembly().GetModules()[0]), 0);
                using (System.Diagnostics.Process curProcess = System.Diagnostics.Process.GetCurrentProcess())
                using (System.Diagnostics.ProcessModule curModule = curProcess.MainModule)
                    hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, (IntPtr)GetModuleHandle(curModule.ModuleName), 0);

                if (hKeyboardHook == 0)
                {
                    Stop();
                    throw new Exception("Set GlobalKeyboardHook failed!");
                }
            }
        }
        public void Stop()
        {
            bool retKeyboard = true;
            if (hKeyboardHook != 0)
            {
                retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
                hKeyboardHook = 0;
            }
            if (!retKeyboard)
                throw new Exception("Unload GlobalKeyboardHook failed!");
        }
        private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
        {
            KeyboardHookStruct MyKBHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
            int keyData = (int)MyKBHookStruct.vkCode;//keyValue
            //引发OnKeyDownEvent
            if (keyDownvalWzard != null && (wParam == SysMessageConst.WM_KEYDOWN || wParam == SysMessageConst.WM_SYSKEYDOWN))
            {
                if (keyDownvalWzard(keyData))
                {
                    return 1;//消息不继续传递
                }

            }
            if (keyUpvalWizard != null && (wParam == SysMessageConst.WM_KEYUP || wParam == SysMessageConst.WM_SYSKEYDOWN))
            {
                if (keyUpvalWizard(keyData)) return 1;
            }

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


        /// <summary>
        /// 声明键盘钩子的封送结构类型
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public class KeyboardHookStruct
        {
            public int vkCode;//表示一个1到254间的虚拟键盘码
            public int scanCode;//表示硬件扫描码
            public int flags;
            public int time;
            public int dwExtraInfo;
        }
    }
    public class war3keyWizard
    {
        public war3keyWizard()
        {
            KeyboardHook KBH = new KeyboardHook();
            KBH.keyDownvalWzard = keyDownproc;
            KBH.keyUpvalWizard = keyUpproc;
        }
        [DllImport("USER32.DLL")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        [DllImport("user32.dll", EntryPoint = "SendMessage")]
        private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);
        //[DllImport("user32.dll")]
        // private static extern bool SetForegroundWindow(IntPtr hWnd);

        //启动修改功能判断
        bool IsWizardON = false;
        public string info = "";
        IntPtr war3;//war3窗口句柄
        void KeyChange(Int32 wParam)
        {
            if (wParam == (int)Keys.Scroll)
            {
                IsWizardON = !IsWizardON;
                info = IsWizardON ? "Wizard-开启" : "Wizard-停用";
            }
            war3 = FindWindow(null, "Warcraft III");
            Logoutput.logput(info);
        }
        //处理键盘按下
        bool keyDownproc(Int32 wParam)
        {
            Logoutput.logput(wParam.ToString()+"被按下");

            KeyChange(wParam);
            if (IsWizardON && war3 != IntPtr.Zero)
            {
                int finalkey = KeyValChangeMap.getKeyChange(wParam);
                if (finalkey > 0)
                {
                    SendMessage(war3, SysMessageConst.WM_KEYDOWN, finalkey, 0);//按下  
                    return true;
                }

            }
            return false;
        }
        //处理键盘松开
        bool keyUpproc(Int32 wParam)
        {
            Logoutput.logput(wParam.ToString() + "被松开");
           // KeyChange(wParam);
            if (IsWizardON && war3 != IntPtr.Zero)
            {
                int finalkey = KeyValChangeMap.getKeyChange(wParam);
                if (finalkey > 0)
                {

                    SendMessage(war3, SysMessageConst.WM_KEYUP, finalkey, 0);//松开
                    return true;
                }

            }
            return false;
        }
        //设置键盘修改 KeyOL被修改键列表  KeyFL替换件
        public void SetKeyMap(List<int> KeyOL, List<int> KeyFL)
        {
            KeyValChangeMap.Clear();
            for (int i = 0; i < KeyOL.Count; i++)
            {
                KeyValChangeMap.insertKeypair(KeyOL[i], KeyFL[i]);
            }
        }
    }
    class KeyValChangeMap
    {
        static Dictionary<int, int> keyMap = new Dictionary<int, int>();
        //keyV 原建制  新键值
        static public void insertKeypair(int keyV, int keyK)
        {
            //插入对
            if (keyMap.ContainsKey(keyK) || keyMap.ContainsValue(keyV))
            {
                return;
            }
            keyMap.Add(keyK, keyV);

        }
        static public void Clear()
        {
            keyMap.Clear();
        }
        public static int getKeyChange(int keyK)
        {
            if (keyMap.ContainsKey(keyK))
            {
                return keyMap[keyK];
            }
            return -1;
        }
    }
    class Logoutput
    {
        static string war3wizartLog = "war3wizartLog.log";
       
       public static void logput(string log)
        {
            string fullfilepaht = System.IO.Path.Combine(Application.StartupPath, war3wizartLog);
            if (!System.IO.File.Exists(fullfilepaht))
                System.IO.File.Create(fullfilepaht);
            System.IO.FileStream fs = new System.IO.FileStream(fullfilepaht,System.IO.FileMode.Append);
            System.IO.StreamWriter sw = new System.IO.StreamWriter(fs);
            sw.WriteLine(log);
            sw.Close();
            fs.Close();
           
        }
    }
}
界面

代码

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

namespace war3Keywizard
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        war3keyWizard W3key = new war3keyWizard();
        private void Form1_Load(object sender, EventArgs e)
        {
            KeyPreview = true;
        }




          static KeyValChangeMap kMP = new KeyValChangeMap();
        private void Intstart()
        {
            List<int> MiniBoard = new List<int>();
            List<int> ReplaceKey = new List<int>();
            if (!string.IsNullOrEmpty(textBox2.Text))
            {
                ReplaceKey.Add((int)textBox2.Text[0]);
                MiniBoard.Add(97);
            }
            if (!string.IsNullOrEmpty(textBox3.Text))
            {
                ReplaceKey.Add((int)textBox3.Text[0]);
                MiniBoard.Add(98);
            }
            if (!string.IsNullOrEmpty(textBox4.Text))
            {
                ReplaceKey.Add((int)textBox4.Text[0]);
                MiniBoard.Add(100);
            }
            if (!string.IsNullOrEmpty(textBox5.Text)) 
            {
                ReplaceKey.Add((int)textBox5.Text[0]);
                MiniBoard.Add(101);
            }
            if (!string.IsNullOrEmpty(textBox6.Text))
            {
                ReplaceKey.Add((int)textBox6.Text[0]);
                MiniBoard.Add(103);
          
            }
            if (!string.IsNullOrEmpty(textBox7.Text))
            {
                ReplaceKey.Add((int)textBox7.Text[0]);
                MiniBoard.Add(104);
            }
            W3key.SetKeyMap(MiniBoard, ReplaceKey);

        }
     

        private void Form1_KeyPress(object sender, KeyPressEventArgs e)
        {
           
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Intstart();

        }
    }


     
        
   
}



3种《魔兽争霸III》方案对比:Grid布局、MOBA位与职业选手配置实测 本文深度评测了《魔兽争霸III》三种主流方案:Grid网格布局、MOBA式QWER位和职业选手配置,通过实测数据与场景化分析,帮助玩家优化操作效率。重点解析了各方案的适用场景、核心配置及实战效果,并提供了个性化定制指南,助力玩家提升APM和反应速度。 阅读详情

相关推荐

Warhelper 工具:跨系统魔兽争霸操作优化

在当今电子竞技领域,魔兽争霸(Warcraft III)仍然吸引着众多忠实的玩家。然而,随着游戏操作复杂性的增加,玩家对提升操作效率和舒适度的需求也随之增长。为此,专门用于魔兽争霸的工具应运而生,旨在帮助玩家简化和自定义游戏操作,提升竞技体验。工具的核心功能是对游戏内的默认位进行调整,使得玩家可以根据自己的习惯设置位方案。这意味着玩家可以将复杂的技能组合映射到简单的按上,或重新布局游戏界面,以提高反应速度和操作精确性。对于初学者而言,使用工具可能稍感陌生。

weixin_35835030的博客 1656

War3Key源码(源码)

VC++编写,需要的朋友可以下载!!!!!!!!

AutoHotkey源码,魔兽助手,显血工具,按精灵等软件皆根据此软件生产

编译方法参照http://www.autohotkey.com/forum/topic19154.html AutoHotkey官方网站:www.autohotkey.com   AutoHotkey爱好者论坛:ahk.5d6d.com (国内唯一在翻译英文帮助文件的论坛,国内唯一被官方首页以中国国旗图标链接的论坛)   简介:   以翻译AutoHotkey软件的英文原版帮助为首要任务的中文论坛。   在2008年6月17日被官方网站首页以中国国旗图标所链接。   AutoHotkey爱好者论坛网址:ahk.5d6d.com   翻译方式:   通过将最新版本AutoHotkey随带的英文帮助CHM文件解压缩,然后直接编辑其中的HTM网页文件,将英文翻译成中文。等有新的HTM网页文件被翻译后,就会重新压缩打包成CHM文件供大家免费使用:-)

AutoHotKey脚本:用热(hotkey)和热字符串(hotstring)简化war3秘籍输入

今天研究了一下AutoHotKey工具,发现我的懒病真是越来越严重了,现在玩war3打电脑竟然连几个秘籍都不想花精力输入了。我写了一个脚本,具备以下两个功能: 利用热字符串(Hotstring)简化秘籍的输入,比如在输入框中输入radar,AutoHostKey会自动将其转换为“ise...

1523

魔兽重置版+喊话

魔兽重置版+喊话 原创软件,绝无广告 附代码 长总求:自己写的+喊话软件 下载地址:https://www.lanzous.com/i979tpe 本站也有上传,还在审核中 最近在玩魔兽争霸3重置版 别的不评价了,没有功能非常麻烦,自己做了一个。 好坏就不评论了,就当给当年补票了吧。 目前版本的建非常不好用 1、自定义建 只能逐个单位修,不能物品栏热,非常不是和R...

showip2012的博客 6641

用PerfHUD来调试商业游戏

来源:http://blog.csdn.net/RAINini/archive/2008/10/28/3162112.aspx            PerfHUD是NV一个非常好用的工具,可以用于查看游戏的运行效率,找出瓶颈,也可以用于分析游戏渲染流程,看每个DPC的渲染操作,包括渲染状态,所用的shader等,非常强大。          PerfHUD正常的用途是用于调试自己写的程序,

痞子龙3D编程 1703

《转,关于lua中的Unicode》

说说最近的几个事情1.project采用lua,ui模块肯定是要彻底使用utf-16的,可是lua不支持,怎么办?最后好像是写了userdata,可以将multibytes转成utf-16保存在这个userdata中;接着为了保证字符串相同的userdata做key时是相同的,于是又添加了相应的避免重复功能;最后还为这个userdata在gc方面作了保证。2.google:lua unicode,...

weixin_30802171的博客 368

Lua脚本中使用Unicode

如何在lua脚本中使用Unicode是本文要介绍的内容,主要是来学习Unicode在lua脚本中如何使用,具体内容来看本文详细内容讲解。说说最近的几个事情: 1、project采用lua,ui模块肯定是要彻底使用utf-16的,可是lua不支持,怎么办?最后好像是写了userdata,可以将multibytes转成utf-16保存在这个userdata中;接着为了保证字符串相同的userdata

cbbbc 6998

在lua脚本中使用unicode

说说最近的几个事情1.project采用lua,ui模块肯定是要彻底使用utf-16的,可是lua不支持,怎么办?最后好像是写了userdata,可以将multibytes转成utf-16保存在这个userdata中;接着为了保证字符串相同的userdata做key时是相同的,于是又添加了相应的避免重复功能;最后还为这个userdata在gc方面作了保证。 2.google:lua unicod

丶祁寒的专栏 3495

java怎么找bug?Arthas原理与实战指南

Arthas作为一款强大的Java诊断工具,通过Java Agent技术实现了对JVM运行时的深度观测和操控能力。无侵入性:不需要修应用代码或重启应用实时分析:能够动态获取运行时数据功能丰富:从线程分析到字节码操作,覆盖了诊断需求易于使用:命令行界面简单直观掌握Arthas使你在面对复杂的Java生产环境问题时,能够像手术刀一样精准定位并解决问题,真正做到知其所以然。在实际应用中,建议通过大量实践熟悉各个命令的使用场景和优缺点,形成自己的问题诊断方法论。

ypl0ipy的博客 1106

魔兽源码

MFC写的魔兽源代码,使用了全局钩子。

VC魔兽争霸3war3源代码

VC魔兽争霸3war3源代码

你想要的魔兽绝对好用

很简单容易上手,而且不大,觉得值得你去下载。。。好的给我留言

魔兽助手源代码(VC6.0)

初步制作,基本功能。 1,一直显血,随便切换。 2,智能识别聊天模式,不用关闭即可正常聊天。 3,分开物品栏和技能。 4,其他有待开发。。。

魔兽争霸如何修快捷

魔兽争霸教程

luyangbin01的专栏 2万+

强大的魔兽--可以像11对战平台一样,自动进入BN!支持命令

限定在A-Z,0-9,TAb,空格,小键盘的7,8,4,5,1,2;F1-F4; 增加Caps Lock和~两个的版本,取消F1帮助响应; 强大的器: 1.高效,游戏聊天不冲突;检测游戏内存,然后dll和主程序通信; 2.游戏最小化时,开始自动提醒;检测游戏内存;判断是否最小化,和游戏是否开始,以提醒; 3.设置密码后可自动登录BN,在主界面按Alt+Enter组合自动登

tandyky的专栏 2万+

魔兽争霸3游戏原理

如果是war3的窗口,则判断此盘消息的值码是否是z的值码,如果是,则通过代码产生一个虚拟按事件,如果不是,则也进行默认的消息处理。虚拟盘事件也同按了盘一样,会在系统消息队列产生新的小键盘1的盘消息,然后此消息又会被全局钩子捕获到,但它此时不是z了,默认不处理派发给游戏窗口。至此,本来按z产生的盘消息,变成了按1产生的盘消息,被放入游戏窗口队列,被游戏窗口的消息处理函数处理,从而实现了。当按下z的时候,把这个盘消息替换为小键盘1,再传递给游戏窗口队列,需求就能实现。

paokuflying的博客 1909

AutoHotkey编写自己的Warkey

<br />AutoHotkey编写自己的Warkeyzyl0462的空间Just Do It!!http://hi.baidu.com/zyl0462/blog/item/47fae38e4c1146e4f01f3612.html2009年11月27日 星期五 12:07认识和学习AutoHotkey还是因为Dota()。Dota?有些人可能还不知道,没关系,知道是个游戏就照了,不过很好玩,推荐玩下,上瘾别怨我。照,继续讲,AutoHotkey能做什么呢?能做的太多了,有兴趣自己体会。下面谈谈用它如何

liuyukuan的专栏 3170
上一篇: 魔兽改键
fym_331
博客等级 码龄10年 2粉丝 2原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值