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)打开一个图片,看它的属性里面象素是多少, ...
随机推荐
- headfirst python 01~02
列表 列表就像是数组 在python 创建一个列表时, 解释器会在内存中创建一个类似数组的数据结构来存储数据, 数据项自下而上(形成一个堆栈), 类似于其他编程语言中的数组. 列表中常用方法: cas ...
- IDEA - 使用总结
查找 Search Everywhere : Double Shift 本文件查找:Ctrl + f 本项目查找:Ctrl + Shift + f 打开类或方法:Ctrl + B 查找类:Ctrl + ...
- net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting head
使用docker 拉镜像的时候,出现下面的错误: net/http: request canceled while waiting for connection (Client.Timeout exc ...
- [Node.js] 09 - Connect with Database
简介两个数据库: Node.js 连接 MySQL Node.js 连接 MongoDB Node.js 连接 MySql 导入已有数据库: unsw@unsw-UX303UB$ mysql -u r ...
- 【SpringCloud微服务实战学习系列】客户端负载均衡Spring Cloud Ribbon
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现.通过Spring Cloud的封装,可以让我们轻松地将面向服务的RES模板 ...
- iOS动画篇:核心动画
转:http://www.cocoachina.com/ios/20160517/16290.html 基本概念 1.什么是核心动画 Core Animation(核心动画)是一组功能强大.效果华丽的 ...
- <a>标签文字强制不换行
强制不换行 a{ white-space:nowrap; } 再补充说明所有关于换行的CSS样式: white-space: normal|pre|nowrap|pre-wrap|pre-line|i ...
- Django----djagorestframwork使用
restful(表者征状态转移,面向资源编程)------------------------------------------->约定 从资源的角度审视整个网络,将分布在网络中某个节点的资源 ...
- Linux多进程和多线程的一次gdb调试实例
转载https://typecodes.com/cseries/multilprocessthreadgdb.html 1 原文整理 默认设置下,在调试多进程程序时gdb只会调试主进程.gdb7以上的 ...
- db2 reorg table failed处理
概要: 当对一个表的结构进行改变后,需要reorg表,重新组织其目录统计信息,为数据库的访问计划提供信息,以便高效执行对其的操作. 对表作reorg操作,发生错误,通过db2 "? sql0 ...