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)打开一个图片,看它的属性里面象素是多少, ...
随机推荐
- Java知多少(82)标签、按钮和按钮事件简介
标签和按钮也许是图形界面中最常见的两种组件,按钮又总是与激发动作事件有关. 标签 标签(JLabel)是最简单的Swing组件.标签对象的作用是对位于其后的界面组件作说明.可以设置标签的属性,即前景色 ...
- 假期小结 BIO, NIO, AIO
虽然忙碌,但仍小有收获,开心. 引子 BIO: Blocking IO,阻塞式IO NIO: Non-blocking IO,非阻塞式IO AIO: Async IO,异步IO 问题 什么是阻塞式IO ...
- (个人)Zookeeper集群环境部署
一.准备工作 1. 下载zookeeper,下载地址:https://zookeeper.apache.org/releases.html#download 2. 下载CentOS7的镜像,下载地址 ...
- 将 GitHub 上的代码向 Coding 更新
问题: 从 GitHub 上 clone 代码到本地很慢,10 KB/s 左右,为了解决这个问题,尝试将 GitHub 上的代码通过离线下载的方式,用百度云和115网盘下载,经常失败,弃之~ 国内也有 ...
- 使用 GCD 实现倒计时效果
效果如下: ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController @p ...
- 同样的so,放到不同的project中,就会报错
网上看到的帖子,笔记一下 最近在看蓝斯的一篇文章基于Platinum库的DMS实现(android) 把其中的so文件直接拷贝到了另外一个project中,jin文件也一样,唯一不同的是包名. 运行报 ...
- SpringBoot------拦截器Filter的使用
前言: 最新Servlet 3.0拦截器的使用 1.pom.xml添加需要使用的依赖 <project xmlns="http://maven.apache.org/POM/4.0.0 ...
- Android 集成ShareSDK分享QQ或空间成功后,回调却不执行的原因
AndroidMainifest.xml中的如箭头所示的id一定要与assets下ShareSDK.xml中配置的QQ的AppId一定要相同. 如下图
- React性能分析利器来了,妈妈再也不用担心我的React应用慢了(转)
Profiler React16.5正式在devtool中加入了Profiler功能,用于收集每次变更导致的渲染时间,帮助开发者发现潜在的性能问题,有助于开发更高性能的React应用 官方博客 如何使 ...
- objective-c启用ARC时的内存管理 (循环引用)
PDF版下载:http://download.csdn.net/detail/cuibo1123/7443125 在Objective-C中,内存的引用计数一直是一个让人比较头疼的问 ...