winform版的dota改键器
从网上找的源码很不齐全,自己补充了一下,有兴趣的可以看看。
首先是建立一个hook类WFChangeKey
using System;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms; namespace WFChangeKey
{
class KeyboardHook
{
private const int WM_KEYDOWN = 0x100;//按下消息
private const int WM_KEYUP = 0x101;//松开消息
private const int WM_SYSKEYDOWN = 0x104;
private const int WM_SYSKEYUP = 0x105;
public event KeyEventHandler OnKeyDownEvent;
public event KeyEventHandler OnKeyUpEvent;
public event KeyPressEventHandler OnKeyPressEvent;
private static int hKeyboardHook = ;
public const int WH_KEYBOARD_LL = ;
public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam); private HookProc keyboardHookProc; [StructLayout(LayoutKind.Sequential)]
public class KeyboardHookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
}
//安装钩子
[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); private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
if ((nCode >= ) && ((OnKeyDownEvent != null) || (OnKeyPressEvent != null) || (OnKeyUpEvent != null)))
{
KeyboardHookStruct myKeyboardHookStruct =
(KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
if (OnKeyDownEvent != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
{
Keys keyData = (Keys)myKeyboardHookStruct.vkCode;
KeyEventArgs e = new KeyEventArgs(keyData);
OnKeyDownEvent(this, e);
}
}
return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
} public void Start()
{
if (hKeyboardHook == )
{
keyboardHookProc = new HookProc(KeyboardHookProc);
using (System.Diagnostics.Process curProcess = System.Diagnostics.Process.GetCurrentProcess())
using (System.Diagnostics.ProcessModule curModule = curProcess.MainModule)
hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, keyboardHookProc,
GetModule(curModule.ModuleName),);
if (hKeyboardHook == )
{
Stop();
throw new Exception("找不到对应句柄!");
}
}
} private IntPtr GetModule(string name)
{
Module m = null;
Module[] modules = Assembly.GetExecutingAssembly().GetModules();
foreach (var module in modules)
{
if (module.Name == name)
m = module;
}
return Marshal.GetHINSTANCE(m);
} public void Stop()
{
bool retKeyboard = true;
if (hKeyboardHook != )
{
retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
hKeyboardHook = ;
}
if (!retKeyboard)
{
throw new Exception("关闭程序失败!");
}
} public KeyboardHook()
{
Start();
} ~KeyboardHook()
{
Stop();
}
}
}
然后在form中监听事件
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.Windows.Forms; namespace WFChangeKey
{
public partial class Form1 : Form
{
KeyboardHook hook = new KeyboardHook();
public Form1()
{
InitializeComponent();
} private void Form1_Load(object sender, EventArgs e)
{
hook.OnKeyDownEvent += new KeyEventHandler(hook_OnKeyDownEvent);
} [DllImport("USER32.dll")]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("USER32.dll")]
public static extern IntPtr SetForegroundWindow(IntPtr hWnd);
private bool isHookEnable = false; private const int WM_KEYDOWN = 0x100;
private const int WM_KEYUP = 0x101;
private IntPtr war3;
void hook_OnKeyDownEvent(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Scroll)
{
isHookEnable = !isHookEnable;
this.Text = isHookEnable ? "开启" : "关闭";
notifyIcon1.Text = this.Text;
}
if (isHookEnable)
{
war3 = FindWindow(null, "Warcraft III");
if (war3 != IntPtr.Zero)
{
SetForegroundWindow(war3);
string key = e.KeyCode.ToString();
if (key == textBox1.Text)
{
SendMessage(war3, WM_KEYDOWN, (int)Keys.NumPad7, );
SendMessage(war3, WM_KEYUP, (int)Keys.NumPad7, );
}
else if (key == textBox2.Text)
{
SendMessage(war3, WM_KEYDOWN, (int)Keys.NumPad8, );
SendMessage(war3, WM_KEYUP, (int)Keys.NumPad8, );
}
else if (key == textBox3.Text)
{
SendMessage(war3, WM_KEYDOWN, (int)Keys.NumPad4, );
SendMessage(war3, WM_KEYUP, (int)Keys.NumPad4, );
}
else if (key == textBox4.Text)
{
SendMessage(war3, WM_KEYDOWN, (int)Keys.NumPad5, );
SendMessage(war3, WM_KEYUP, (int)Keys.NumPad5, );
}
else if (key == textBox5.Text)
{
SendMessage(war3, WM_KEYDOWN, (int)Keys.NumPad1, );
SendMessage(war3, WM_KEYUP, (int)Keys.NumPad1, );
}
else if (key == textBox6.Text)
{
SendMessage(war3, WM_KEYDOWN, (int)Keys.NumPad2, );
SendMessage(war3, WM_KEYUP, (int)Keys.NumPad2, );
} //MessageBox.Show(e.KeyCode.ToString());
}
else
{
//throw new Exception("找不到war3!");
}
}
} [DllImport("USER32.DLL")]
public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam); private void button1_Click(object sender, EventArgs e)
{
if (button1.Text == "启动")
{
isHookEnable = true;
button1.Text = "关闭";
}
else
{
isHookEnable = false;
button1.Text = "启动";
}
} private void textBox_KeyDown(object sender, KeyEventArgs e)
{
TextBox tb = sender as TextBox;
tb.Text = e.KeyCode.ToString();
this.SelectNextControl(this.ActiveControl, true, true, true, false);
} }
}
winform版的dota改键器的更多相关文章
- War3Tool dota改键v3.3版
wartool魔兽全屏改键功能:1.支持11平台自定义改建,自动进局域网(同类软件暂时没发现这个功能)2.技能改键,可以有效的切换适合你的技能键3.war3路径扫描,运行本程序一键就能打开war3 ( ...
- 一个简易的dota改键助手
那年,刚开始玩dota的时候, 发现物品栏的快捷键太不好按鸟(集中在小键盘的数字键).于是各种改键工具应运而生,像最经典的warkey, 不知不觉就用了好多年.如今,各种改键工具越来越强大了, 支持各 ...
- 用C#钩子写一个改键外挂
我的微信群——软件开发测试工程师交流群,欢迎扫码: 改键是一种习惯,比如在玩儿lol或者dota的时候.理论上玩儿什么游戏都可以改键. 做一个窗体(点击Install——应用改键,点击Uninstal ...
- 自制C#版3DS文件的解析器并用SharpGL显示3DS模型
自制C#版3DS文件的解析器并用SharpGL显示3DS模型 我已经重写了3ds解析器,详情在此(http://www.cnblogs.com/bitzhuwei/p/CSharpGL-2-parse ...
- Android高级图片滚动控件,编写3D版的图片轮播器
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17482089 大家好,好久不见了,最近由于工作特别繁忙,已经有一个多月的时间没写博 ...
- RDIFramework.NET V3.3 WinForm版角色授权管理新增角色对操作权限项、模块起止生效日期的设置
在实际应用在我们可能会有这样的需求,某个操作权限项(按钮)或菜单在某个时间范围内可以让指定角色访问.此时通过我们的角色权限扩展设置就可以办到. 在我们框架V3.3 WinForm版全新增加了角色权限扩 ...
- Mac改键软件Karabiner使用教程
Mac改键软件Karabiner使用教程 目前Mac上比较好用的改键软件是Karabiner,不过对于最新的Sierra系统,Karabiner失效了.这里介绍的实际上是Karabiner-Eleme ...
- 任务驱动,Winform VS WEB对比式学习.NET开发系列第一篇------身份证解析(不断更新的WEB版本及Winform版本源码)
一 本系列培训随笔适用人群 1. 软件开发初学者 2. 有志于转向Web开发的Winform程序员 3. 想了解桌面应用开发的Web程序员 二 高效学习编程的办法 1 任务驱动方式学习软件开发 大部分 ...
- C# Winform版批量压缩图片程序
需求 上周,领导给我分配了一个需求:服务器上的图片文件非常大,每天要用掉两个G的大小的空间,要做一个自动压缩图片的工具处理这些大图片.领导的思路是这样的: 1)打开一个图片,看它的属性里面象素是多少, ...
随机推荐
- 从去除毛刺的策略看开运算opening_circle和闭运算closing_circle的异同
例一:毛刺在往外凸的面上 策略1:分割出黑色部分,然后通过开运算去掉毛刺,再通过原黑色部分区域减去开运算之后的区域,得到毛刺部分的区域. read_image (Tu, 'C:/Users/xiahu ...
- Java如何匹配列表中的电话号码?
在Java编程中如何匹配列表中的电话号码? 以下示例显示如何使用phone.matches(phoneNumberPattern)方法将列表中的电话号码与指定模式相匹配. package com.yi ...
- 【代码审计】五指CMS_v4.1.0 后台存在SQL注入漏洞分析
0x00 环境准备 五指CMS官网:https://www.wuzhicms.com/ 网站源码版本:五指CMS v4.1.0 UTF-8 开源版 程序源码下载:https://www.wuzhi ...
- [Linux] 硬盘构造与分区
首先让我们从物理结构上了解一下硬盘的存储原理. 硬盘构造示意图: 1. head:磁头,磁盘盘面上的磁头,有几个磁头,就有几个盘面.从0开始编号,最大255,表示总共256个磁头. 2. cylind ...
- ansj分词原理
ansj第一步会进行原子切分和全切分,并且是在同时进行的.所谓原子,是指短句中不可分割的最小语素单位.例如,一个汉字就是一个原子.全切分,就是把一句话中的所有词都找出来,只要是字典中有的就找出来.例如 ...
- linux-Centos 7下bond与vlan技术的结合
服务器eno1与eno2作bonding,捆绑成bond0接口,服务器对端交换机端口,同属于301.302号vlan接口 vlan 301: 10.1.2.65/27 ...
- 重装win7,win10,Ubuntu
使用的软件多了,大了,感觉用起来很卡,快就是生产力,一定要重视.就去维修电安装了120G的固态硬盘,以前所安装的软件都没有了,距上一次重装快一年了,上次修了风扇,加了4G内存条.现在很多东西也一并删除 ...
- day_11py学习
''' 字典增加和删除 1.添加 xxx[新的key] = value 2.删除 del xxx[key] 3.修改 xxx[已存在的key] = new_value 4.查询 xxx.get(key ...
- ftp如何使用命令上传文件
本地上传到服务器的步骤如下: 1."开始"-"运行"-输入"FTP" 2.open qint.ithot.net 这一步可以与第一步合并,在 ...
- C++设计实现一个不能被继承的类
C++不同于Java,Java中被final关键字修饰的类不能被继承,C++能实现不被继承的类,但是需要自己实现. 为了使类不被继承,最好的办法是使子类不能构造父类的部分,此时子类就无法实例化整个子类 ...