从网上找的源码很不齐全,自己补充了一下,有兴趣的可以看看。

首先是建立一个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改键器的更多相关文章

  1. War3Tool dota改键v3.3版

    wartool魔兽全屏改键功能:1.支持11平台自定义改建,自动进局域网(同类软件暂时没发现这个功能)2.技能改键,可以有效的切换适合你的技能键3.war3路径扫描,运行本程序一键就能打开war3 ( ...

  2. 一个简易的dota改键助手

    那年,刚开始玩dota的时候, 发现物品栏的快捷键太不好按鸟(集中在小键盘的数字键).于是各种改键工具应运而生,像最经典的warkey, 不知不觉就用了好多年.如今,各种改键工具越来越强大了, 支持各 ...

  3. 用C#钩子写一个改键外挂

    我的微信群——软件开发测试工程师交流群,欢迎扫码: 改键是一种习惯,比如在玩儿lol或者dota的时候.理论上玩儿什么游戏都可以改键. 做一个窗体(点击Install——应用改键,点击Uninstal ...

  4. 自制C#版3DS文件的解析器并用SharpGL显示3DS模型

    自制C#版3DS文件的解析器并用SharpGL显示3DS模型 我已经重写了3ds解析器,详情在此(http://www.cnblogs.com/bitzhuwei/p/CSharpGL-2-parse ...

  5. Android高级图片滚动控件,编写3D版的图片轮播器

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/17482089 大家好,好久不见了,最近由于工作特别繁忙,已经有一个多月的时间没写博 ...

  6. RDIFramework.NET V3.3 WinForm版角色授权管理新增角色对操作权限项、模块起止生效日期的设置

    在实际应用在我们可能会有这样的需求,某个操作权限项(按钮)或菜单在某个时间范围内可以让指定角色访问.此时通过我们的角色权限扩展设置就可以办到. 在我们框架V3.3 WinForm版全新增加了角色权限扩 ...

  7. Mac改键软件Karabiner使用教程

    Mac改键软件Karabiner使用教程 目前Mac上比较好用的改键软件是Karabiner,不过对于最新的Sierra系统,Karabiner失效了.这里介绍的实际上是Karabiner-Eleme ...

  8. 任务驱动,Winform VS WEB对比式学习.NET开发系列第一篇------身份证解析(不断更新的WEB版本及Winform版本源码)

    一 本系列培训随笔适用人群 1. 软件开发初学者 2. 有志于转向Web开发的Winform程序员 3. 想了解桌面应用开发的Web程序员 二 高效学习编程的办法 1 任务驱动方式学习软件开发 大部分 ...

  9. C# Winform版批量压缩图片程序

    需求 上周,领导给我分配了一个需求:服务器上的图片文件非常大,每天要用掉两个G的大小的空间,要做一个自动压缩图片的工具处理这些大图片.领导的思路是这样的: 1)打开一个图片,看它的属性里面象素是多少, ...

随机推荐

  1. ZeroMQ总结

    Socket types Thread safety: ZeroMQ的socket是非线程安全的,并且ZeroMQ本身不建议在多个线程中传递同一个Socket,即使保证了线程同步.   Socket ...

  2. 前端分页插件pagination

    摘要: 最近在开发项目中又用到了前端分页,以前也做过,为了方便以后使用所以将他封装成第三方插件,不依赖任何库.网上已经有很多插件,问什么还要自己造轮子? 自己写的扩展性高 不依赖任何库 作为一次技术沉 ...

  3. [UFLDL] Generative Model

    这一部分是个坑,应该对绝大多数菜鸡晕头转向的部分,因为有来自物理学界的问候. Deep learning:十九(RBM简单理解) Deep learning:十八(关于随机采样)    采样方法 [B ...

  4. react学习笔记(一)用create-react-app构建 React 开发环境

    React 可以高效.灵活的用来构建用户界面框架,react利用高效的算法最小化重绘DOM. create-react-app 是来自于 Facebook,通过该命令不需配置就能快速构建 React ...

  5. SpringBoot Docker Mysql安装,Docker安装Mysql

    SpringBoot Docker Mysql安装,Docker安装Mysql ================================ ©Copyright 蕃薯耀 2018年4月8日 ht ...

  6. MySQL 无法连接

    Host 'localhost' is not allowed to connect to this MySQL server 错误 解决办法: C:\Program Files\MySQL\MySQ ...

  7. C语言实现mq收发数据的函数

    amqsget.c 从mq中读取消息 #include <stdio.h> #include <stdlib.h> #include <string.h> #inc ...

  8. Puppet file资源使用

    1.文件管理介绍:          可管理的项目: 支持文件和目录 设置文件及目录的所有者及权限 恢复文件(包括文件的内容.权限及所有者) 清理目录以及子目录 2. 可使用参数: ensure :指 ...

  9. scala 模式匹配详解 1

    什么是模式? 一些刚从java转到scala的同学在开发的过程中犹如深陷沼泽,因为很多的概念或风格不确定,scala里有很多的坑,模式匹配也算一个.我整理了一下自己所理解的概念,以及一些例子.这个系列 ...

  10. angular 4 和django 1.11.1 前后端交互 总结

    首先 angular4 和django 1.11.1交互 有跨域问题 所以先关闭cors 和csrf验证 一.解决跨域问题 cors github django-cors-headers 1)安装co ...