WINIO64位模拟键鼠操作

最近玩游戏有点入迷,心急升级经验,于是某天开始"挂尸体",一系列手动操作之后决定写一个外挂,模拟一系列键盘和鼠标操作,没做过游戏winform也用得少,开始以为只要简单调用winApi的键盘和鼠标就能够实现...结果

后来才发现游戏一般都禁用了winAPI,最后找了一个驱动级的模拟PS2端口的三方库(WinIO),因为是64位的电脑涉及到数字证书之类的比较麻烦,不过最后好歹都实现了需要的功能,里面写了一些截取屏幕指定坐标图片与采集的图片做对比,

以实现什么时候该点什么时候不该点的判断,一些关键的代码当做随笔记录下来.

将游戏窗体保持最前

  [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern int SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int x, int y, int Width, int Height, int flags);
        /// <summary>
        /// 得到当前活动的窗口
        /// </summary>
        /// <returns></returns>
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        private static extern System.IntPtr GetForegroundWindow();

        [DllImport("User32.dll", EntryPoint = "FindWindow")]
        private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        private void button1_Click(object sender, EventArgs e)
        {
            IntPtr hwnd;
            hwnd = FindWindow(null, "XXXX");  //根据程序标题获取句柄
            SetWindowPos(hwnd, -1, 0, 0, 0, 0, 1 | 2);  //设置在最前
        }

64位win7操作 winIO

 public class WinIO
    {
        public const int KBC_KEY_CMD = 0x64;//输入键盘按下消息的端口

        public const int KBC_KEY_DATA = 0x60;//输入键盘弹起消息的端口

        [DllImport("WinIo64.dll")]
        public static extern bool InitializeWinIo();

        [DllImport("WinIo64.dll")]
        public static extern bool GetPortVal(IntPtr wPortAddr, out int pdwPortVal,

                    byte bSize);

        [DllImport("WinIo64.dll")]
        public static extern bool SetPortVal(uint wPortAddr, IntPtr dwPortVal,

                    byte bSize);

        [DllImport("WinIo64.dll")]
        public static extern byte MapPhysToLin(byte pbPhysAddr, uint dwPhysSize,

                        IntPtr PhysicalMemoryHandle);

        [DllImport("WinIo64.dll")]
        public static extern bool UnmapPhysicalMemory(IntPtr PhysicalMemoryHandle,

                        byte pbLinAddr);

        [DllImport("WinIo64.dll")]
        public static extern bool GetPhysLong(IntPtr pbPhysAddr, byte pdwPhysVal);

        [DllImport("WinIo64.dll")]
        public static extern bool SetPhysLong(IntPtr pbPhysAddr, byte dwPhysVal);

        [DllImport("WinIo64.dll")]
        public static extern void ShutdownWinIo();

        [DllImport("user32.dll")]
        public static extern int MapVirtualKey(uint Ucode, uint uMapType);

        private WinIO()
        {
            IsInitialize = true;
        }
        public static void Initialize()
        {
            if (InitializeWinIo())
            {
                KBCWait4IBE();
                IsInitialize = true;
            }
        }
        public static void Shutdown()
        {
            if (IsInitialize)
                ShutdownWinIo();
            IsInitialize = false;
        }

        private static bool IsInitialize { get; set; }

        ///等待键盘缓冲区为空
        private static void KBCWait4IBE()
        {
            int dwVal = 0;
            do
            {
                bool flag = GetPortVal((IntPtr)0x64, out dwVal, 1);
            }
            while ((dwVal & 0x2) > 0);
        }
        /// 模拟键盘标按下
        public static void KeyDown(Keys vKeyCoad)
        {
            if (!IsInitialize) return;

            int btScancode = 0;
            btScancode = MapVirtualKey((uint)vKeyCoad, 0);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)0x60, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)btScancode, 1);
        }
        /// 模拟键盘弹出
        public static void KeyUp(Keys vKeyCoad)
        {
            if (!IsInitialize) return;

            int btScancode = 0;
            btScancode = MapVirtualKey((uint)vKeyCoad, 0);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)0x60, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)(btScancode | 0x80), 1);
        }
    }

调用:

1.初始实例: WinIO.Initialize();

2.模拟按键

WinIO.KeyDown(Keys.A); // 按下A
Thread.Sleep(100);
WinIO.KeyUp(Keys.A); // 松开A

3.窗体关闭之后注销: WinIO.Shutdown(); // 用完后注销

当然WINIO在64位下没有正式的数字证书,用得时候需要手动在测试模式下为sys文件导入证书. 命令 ( bcdedit /set testsigning on )

鼠标模拟

 1   [DllImport("user32.dll")]
 2         private static extern int SetCursorPos(int x, int y);
 3
 4         public enum MouseEventFlags
 5         {
 6             Move = 0x0001,
 7             LeftDown = 0x0002,
 8             LeftUp = 0x0004,
 9             RightDown = 0x0008,
10             RightUp = 0x0010,
11             MiddleDown = 0x0020,
12             MiddleUp = 0x0040,
13             Wheel = 0x0800,
14             Absolute = 0x8000
15         }
16         [DllImport("User32")]
17         public extern static void mouse_event(int dwFlags, int dx, int dy, int dwData, IntPtr dwExtraInfo);
18
19         /// <summary>
20         /// 移动鼠标到指定的坐标点
21         /// </summary>
22         public void MoveMouseToPoint()
23         {
24             string settingValue = ConfigurationManager.AppSettings.Get("Point");
25             string[] pList = settingValue.Split(‘,‘);
26             Point centerP = new Point(int.Parse(pList[0]), int.Parse(pList[1]));
27             if (checkBox1.Checked)
28             {
29                 SetCursorPos(centerP.X, centerP.Y);
30                 mouse_event((int)(MouseEventFlags.LeftDown | MouseEventFlags.Absolute), 0, 0, 0, IntPtr.Zero);
31                 mouse_event((int)(MouseEventFlags.LeftUp | MouseEventFlags.Absolute), 0, 0, 0, IntPtr.Zero);
32             }
33         }
34         /// <summary>
35         /// /// 设置鼠标的移动范围
36         /// </summary>
37         public void SetMouseRectangle(Rectangle rectangle)
38         {
39             System.Windows.Forms.Cursor.Clip = rectangle;
40         }

最后还有一点采集游戏中固定位置的图片到内存中与事先采集好的图片做对比的代码下次再上传

  

时间: 2024-10-11 17:49:48

WINIO64位模拟键鼠操作的相关文章

Python实现按键精灵(一)-键鼠操作

需要安装 pywin32库 pip install pywin32 import win32api import time #鼠标移动 def mouse_move(x,y): win32api.SetCursorPos([x,y]) #鼠标点击,默认左键 def mouse_click(click_type="left"): if click_type=="left": win32api.mouse_event(win32con.MOUSEEVENTF_LEFTU

模拟鼠标键盘操作,含硬件模拟技术[转载]

键盘是我们使用计算机的一个很重要的输入设备了,即使在鼠标大行其道的今天,很多程序依然离不开键盘来操作.但是有时候,一些重复性的,很繁琐的键盘操作总会让人疲惫,于是就有了用程序来代替人们按键的方法,这样可以把很多重复性的键盘操作交给程序来模拟,省了很多精力,按键精灵就是这样的一个软件.那么我们怎样才能用VB来写一个程序,达到与按键精灵类似的功能呢?那就让我们来先了解一下windows中响应键盘事件的机制.    当用户按下键盘上的一个键时,键盘内的芯片会检测到这个动作,并把这个信号传送到计算机.如

多台主机共享键鼠

synergy 是一个用于在多台主机间(Linux, Windows)共享键鼠的工具, 下载 从以下网站下载synergy http://synergy-project.org/ 这里用Linux和Windows举例: 64位Linux下下载: http://synergy-project.org/download/?file=synergy-1.5.0-r2278-Linux-x86_64.rpm 64位Windows下下载: http://synergy-project.org/downlo

php数组键值操作和数组统计函数-函数

1.数组函数//作用:提供了很多官方写的很多有用的代码段,提高编写速度 1)数组的键值操作函数 array_values();//获取数组中的值 array_keys();//获取数组中的键 in_array();//检查一个值是否在数组中 array_flip();//键和值对调 array_reverse();//数组中的值反转 模拟获取key的数值<?php $arr=array ("name"=>"user1","age"=&

Synergy 一套键鼠同时控制多台电脑的神器!超级方便!

想必很多人都拥有多台电脑,譬如台式机+笔记本,很多时候我们都会同时打开它们工作.可是你有没发现,如果桌子上摆放着多台电脑多套键盘鼠标,不停来回切换使用是否很累呢?如果说现在可以只用一套键鼠,就能同时控制你全部的电脑,你会否兴奋? Synergy 正是为此而生的好工具!它可以让你的多台电脑共享一套键鼠,甚至还可以共享剪贴板,而你只需动动鼠标,指针就可以轻松地在各台电脑屏幕之间来回穿梭,就像一台电脑使用多个显示器一样.而且 Synergy 完全免费开源,并跨平台支持 Win/Mac/Linux,相当

C# 模拟键盘按键操作

[DllImport("user32.dll")] public static extern IntPtr keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtralnfo); private void KeyTab() { keybd_event(9, 0, 0, 0); // keybd_event(9, 0, 1, 0); }//百度百科地址:http://baike.baidu.com/view/1080077.htm

无线键鼠监听与劫持

引言:键盘是生活中最常见的硬件之一,无线键鼠由于其方便美观受到很多人的青睐,那么它的安全性如何呢?面对攻击我们又如何防护呢? 本文选自<硬件安全攻防大揭秘>. 1.无线键鼠的兴起 键盘连接到计算机有多种方式,有线键盘鼠标在生活中最常见,适用范围也很广泛,但有线连接不仅对操作距离有限制,而且给携带造成了不便.不仅如此,繁杂的线缆还很容易把桌面弄得凌乱不堪.无线键鼠非常好地解决了上述问题.无线键鼠又分为蓝牙类型和2.4GHz 类型,文中所指的无线鼠标一般指2.4GHz 类型.值得注意的是,虽然蓝牙

雷柏 1800 键鼠 对码工具分享

最近我的雷柏1800键鼠的接收器坏了 换了个小的接收器, 但是需要对码,不然不能用. 在之前下的是官方的v3.2版本的对码器,脑子有病的,总是不行. 后来试了3.1 3.0. 2.1 还是强制绑定不行. 最终发现了它 2.7版本. 这个版本是兼容雷柏1800键鼠的对码的.一试就灵.真好.哈哈 所以分享给大家 下载地址:http://download.csdn.net/detail/zhang3387405/7541905 雷柏 1800 键鼠 对码工具分享

php模拟数据库常用操作效果

test.php <?php header("Content-type:text/html;charset='utf8'"); error_reporting(E_ALL); echo "模拟数据库常用操作效果<br>"; echo "<a href='check.php?action=add'>执行增加操作</a><br>"; echo "<a href='check.php