日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

WINIO64位模拟键鼠操作

發布時間:2023/12/13 综合教程 30 生活家
生活随笔 收集整理的這篇文章主要介紹了 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);  //設置在最前
        }

View Code

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);
        }
    }

View Code

調用:

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         }

View Code

最后還有一點采集游戲中固定位置的圖片到內存中與事先采集好的圖片做對比的代碼下次再上傳

  

總結

以上是生活随笔為你收集整理的WINIO64位模拟键鼠操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: av手机在线| www.我爱av| 欧美精品一二三区 | 色屋在线| 亚洲偷偷 | 午夜精品一区二区三区免费视频 | 4hu最新网址 | 97精品国产露脸对白 | 亚洲图片偷拍区 | 麻豆爱爱 | 4438x全国最大成人 | 日本黄色三级视频 | 视频一区日韩 | 超碰超碰 | 中文字幕第27页 | 久久这里只精品 | 性色av一区二区三区免费 | 96久久精品 | 可以在线看黄的网站 | 精品国产乱码久久久久久鸭王1 | 全国最大色 | 官场艳妇疯狂性关系 | 久久久精品人妻av一区二区三区 | 成人欧美视频在线观看 | 中文天堂网 | 亚洲男人在线 | 一本一道波多野结衣一区二区 | 久久av综合 | 久久综合干 | 东方av在线免费观看 | 三级黄色视屏 | ass极品国模人体欣赏 | 国产情侣自拍av | 国产三极片 | 欧美成人看片黄a免费看 | 天天想你在线观看完整版高清 | 巨乳动漫美女 | 日韩欧美一区二区免费 | 欧美日韩高清在线播放 | 91成人午夜 | 激情av一区| 豆花av在线 | 欧美一区二区三区日韩 | 亚洲 欧美 成人 | 性欧美丰满熟妇xxxx性仙踪林 | 九色.com| 伊人色av | 久热这里只有精品6 | 国产v片| 不卡影院一区二区 | 国产精品久久久久久人 | 免费的性爱视频 | 男女黄色又爽大片 | 色屁屁一区二区 | 色干网 | 天天噜夜夜噜 | 成人午夜网 | 国产又粗又猛又爽免费视频 | 四虎最新网址在线观看 | 日韩丰满少妇无码内射 | 久久人人添人人爽添人人片 | 亚洲免费一区 | 相亲对象是问题学生动漫免费观看 | 一道本一区| 国产黄色高清 | 动漫艳母在线观看 | 手机看片日韩 | 日本一二三区在线 | av日日夜夜 | 一区久久 | av在线视 | 亚洲国产欧洲 | 不卡的av片| 天天爽天天 | 91麻豆国产在线观看 | 天天射天天干天天操 | 亚洲国产爱 | 亚洲视频手机在线 | 日韩精品在线一区 | 大奶子网站 | 日韩伦理中文字幕 | 中文字幕乱码亚洲精品一区 | 激情图片在线视频 | 成人天堂 | 狠狠干2018 | 黄片毛片在线观看 | 免费三级大片 | 日韩av.com| 中文在线一区二区 | 国产成人啪免费观看软件 | 69人妻精品久久无人专区 | 久久精品国内 | 国内老熟妇对白hdxxxx | 丁香婷婷久久 | 神马午夜dy888| 少妇又色又紧又黄又刺激免费 | 黄色三级三级 | 亚洲色婷婷久久精品av蜜桃 | 精品熟妇视频一区二区三区 |