zoukankan      html  css  js  c++  java
  • 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 = 0;
            public const int WH_KEYBOARD_LL = 13;
            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 >= 0) && ((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 == 0)
                {
                    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),0);
                    if (hKeyboardHook == 0)
                    {
                        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 != 0)
                {
                    retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
                    hKeyboardHook = 0;
                }
                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, 0);
                            SendMessage(war3, WM_KEYUP, (int)Keys.NumPad7, 0);
                        }
                        else if (key == textBox2.Text)
                        {
                            SendMessage(war3, WM_KEYDOWN, (int)Keys.NumPad8, 0);
                            SendMessage(war3, WM_KEYUP, (int)Keys.NumPad8, 0);
                        }
                        else if (key == textBox3.Text)
                        {
                            SendMessage(war3, WM_KEYDOWN, (int)Keys.NumPad4, 0);
                            SendMessage(war3, WM_KEYUP, (int)Keys.NumPad4, 0);
                        }
                        else if (key == textBox4.Text)
                        {
                            SendMessage(war3, WM_KEYDOWN, (int)Keys.NumPad5, 0);
                            SendMessage(war3, WM_KEYUP, (int)Keys.NumPad5, 0);
                        }
                        else if (key == textBox5.Text)
                        {
                            SendMessage(war3, WM_KEYDOWN, (int)Keys.NumPad1, 0);
                            SendMessage(war3, WM_KEYUP, (int)Keys.NumPad1, 0);
                        }
                        else if (key == textBox6.Text)
                        {
                            SendMessage(war3, WM_KEYDOWN, (int)Keys.NumPad2, 0);
                            SendMessage(war3, WM_KEYUP, (int)Keys.NumPad2, 0);
                        }
                        
                        //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);
            }
    
    
        }
    }
  • 相关阅读:
    Directx11教程(63) tessellation学习(5)
    OpenCL 学习step by step (1) 安装AMD OpenCL APP
    Directx11教程(62) tessellation学习(4)
    Directx11教程(61) tessellation学习(3)
    Notes 和 Domino 已知限制
    asp.net中的WebApplication和WebSite
    平淡的2007
    TinyMCE与Domino集成
    jOOQ 2.6.0 发布,Java的ORM框架
    bandwidth 0.32f 发布,内存带宽测试工具
  • 原文地址:https://www.cnblogs.com/mengxingxinqing/p/3564176.html
Copyright © 2011-2022 走看看