国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C# 開發(fā) DNF手搓按鍵。keybd_event 模擬鍵盤操作(重點是方向鍵模擬)

這篇具有很好參考價值的文章主要介紹了C# 開發(fā) DNF手搓按鍵。keybd_event 模擬鍵盤操作(重點是方向鍵模擬)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、開發(fā)目標(biāo):使用keybd_event和鍵盤HOOK實現(xiàn)一個按鍵模擬DNF中的技能指令。操作角色是紅眼。

二、項目進度:初步實現(xiàn)技能指令釋放,沒有對鍵盤連按做處理,會有N多重復(fù)命令,導(dǎo)致角色會抽搐。沒有做自定義按鍵,所有指令都是寫到程序中的,不夠靈活。

三、開發(fā)環(huán)境:Win11 ,VS 2022, .net6

四、詳細(xì)介紹:

  1. 創(chuàng)建鍵盤鉤子,攔截鍵盤操作

 public class Hook
    {
        /// <summary>
        /// 構(gòu)造函數(shù)
        /// </summary>
        public Hook() { }
        /// <summary>
        /// 單例模式
        /// </summary>
        public static readonly Hook _HookClient = new Hook();

        #region 鉤子
        //委托 
        public delegate int HookProc(int nCode, int wParam, IntPtr lParam);
        HookProc KeyBoardHookProcedure;

        public delegate void HookHandle(Keys key, int DownOrUp);
        public event HookHandle EventHandle;

        //鉤子狀態(tài)
        public static int hHook = 0;
        //鍵盤Hook結(jié)構(gòu)函數(shù) 
        [StructLayout(LayoutKind.Sequential)]
        public class KeyBoardHookStruct
        {
            public int vkCode;
            public int scanCode;
            public int flags;
            public int time;
            public int dwExtraInfo;
        }
        #region DllImport
        //設(shè)置鉤子 
        [DllImport("user32.dll")]
        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 bool UnhookWindowsHookEx(int idHook);

        //調(diào)用下一個鉤子 
        [DllImport("user32.dll")]
        public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);

        //獲取模塊處理
        [DllImport("kernel32.dll")]
        public static extern IntPtr GetModuleHandle(string name);

        /// <summary>
        /// 獲取按鍵狀態(tài)
        /// </summary>
        /// <param name="nVirtKey"></param>
        /// <returns></returns>
        [DllImport("user32.dll")]
        public static extern short GetKeyState(int nVirtKey);

        const int WM_KEYUP = 0x101;//抬起
        const int WM_KEYDOWN = 0x100;//按下
        const int WM_SYSKEYDOWN = 0x0104;//系統(tǒng)鍵按下
        const int WM_SYSKEYUP = 0x0105;//系統(tǒng)鍵抬起
        const int WM_COPYDATA = 0x004A;//消息中的msg;
        const int WH_KEYBOARD_LL = 13;//鍵盤獲取級別(高),可獲取系統(tǒng)按鍵(Ctrl、Shift等)
        const int WH_KEYBOARD = 2;//鍵盤獲取級別(低),不能可獲取系統(tǒng)按鍵(Ctrl、Shift等)

        #endregion

        #region 自定義事件
        public void Hook_Start()
        {
            // 安裝鍵盤鉤子 
            if (hHook == 0)
            {
                KeyBoardHookProcedure = new HookProc(KeyBoardHookProc);

                //hHook = SetWindowsHookEx(WH_KEYBOARD_LL,KeyBoardHookProcedure,GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName), 0);
                hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyBoardHookProcedure, GetModuleHandle("user32"), 0);
                //如果設(shè)置鉤子失敗. 
                if (hHook == 0)
                {

                    Hook_Clear();
                    throw new Exception("設(shè)置Hook失敗!");
                }
            }
        }

        //取消鉤子事件 
        public void Hook_Clear()
        {
            bool retKeyboard = true;
            if (hHook != 0)
            {

                retKeyboard = UnhookWindowsHookEx(hHook);
                hHook = 0;
            }
            //如果去掉鉤子失敗. 
            if (!retKeyboard)
            {
                //Debug.WriteLine("鉤子注銷失??!該鉤子可能已經(jīng)失效");
            }
        }

        //這里可以添加自己想要的信息處理 
        public int KeyBoardHookProc(int nCode, int wParam, IntPtr lParam)
        {

            int sendW = wParam;

            if (nCode >= 0)
            {  

                KeyBoardHookStruct kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyBoardHookStruct));
 
? ? ? ? ? ? ? ? //獲取按鍵的鍵值
                Keys key = (Keys)kbh.vkCode;
                 
                //處理鍵盤命令
                EventHandle?.Invoke(key, wParam);  
                
            }
            int ww = CallNextHookEx(hHook, nCode, wParam, lParam);
            return ww;
        }


        #endregion

        #endregion


    }
  1. 創(chuàng)建一個窗口添加一個CheckBox用于啟動和關(guān)閉模擬功能

C# 開發(fā) DNF手搓按鍵。keybd_event 模擬鍵盤操作(重點是方向鍵模擬)
  1. 雙擊checkbox 控件編寫checkBox1_CheckedChanged事件

 private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            if (this.checkBox1.Checked)
            {
                Hook._HookClient.Hook_Start();  //加載鉤子 
                Hook._HookClient.EventHandle += _HookClient_EventHandle;
                Hook._HookClient.EventHandle11 += _HookClient_EventHandle11;
            }
            else
            {
                Hook._HookClient.EventHandle -= _HookClient_EventHandle;
                Hook._HookClient.EventHandle11 -= _HookClient_EventHandle11;
                Hook._HookClient.Hook_Clear();
            }
        }
  1. 使用User32標(biāo)記創(chuàng)建Win32API調(diào)用方法

 
? ? ? ? //模擬鍵盤API  鍵值用byte最準(zhǔn)確
        [DllImport("user32.dll", EntryPoint = "keybd_event", SetLastError = true)]
        public static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, uint dwExtraInfo);
 ? ? ? ?byte VK_LEFT = 0x64;//向左鍵(數(shù)字鍵盤4)
        byte VK_UP = 0x68;   //向上鍵(數(shù)字鍵盤8)
        byte VK_RIGHT = 0x66;    //向右鍵(數(shù)字鍵盤6)
        byte VK_DOWN = 0x65; //向下鍵(數(shù)字鍵盤5)
        byte VK_SPACE = 0x20;   //空格鍵
        byte VK_Z = 0x2c;       //Z

        byte CO_LEFT = 0x4b;//向左鍵(數(shù)字鍵盤4)
        byte CO_UP = 0X48;   //向上鍵(數(shù)字鍵盤8)
        byte CO_RIGHT = 0x4d;    //向右鍵(數(shù)字鍵盤6)
        byte CO_DOWN = 0x4c; //向下鍵(數(shù)字鍵盤5)
        byte CO_SPACE = 0x39;   //空格鍵 
        byte CO_Z = 0x2c;       //Z
? ? ? ? /// <summary>
        /// 按下
        /// </summary>
        const byte KEYEVENTF_KEYDOWN = 0;
        /// <summary>
        /// 抬起
        /// </summary>
        const byte KEYEVENTF_KEYUP = 2;
  1. 編寫按鍵處理方法_HookClient_EventHandle

 ? ? ? ? //創(chuàng)建一個隨機數(shù),用來隨機按鍵按下的時長,更真實的模擬手動操作。
? ? ? ? Random rd = new Random();
        private void _HookClient_EventHandle(Keys key, int DownOrUp)
        {

            switch (key)
            {
                 
                case Keys.A:
                    //下上上z
                    血氣之刃();
                    break;
                case Keys.B:
                    break;
                case Keys.C:
                    break;
                case Keys.D:
                    怒氣爆發(fā)();
                    //噬魂之手();
                    break;
                case Keys.E:
                    致命血隕();
                    break;
                case Keys.F:
                    血氣爆發(fā)();
                    break;
                case Keys.G:
                    暴怒狂斬();
                    break;
                case Keys.H:
                    瘋魔血魂斬();
                    break;
                case Keys.I:
                    break;
                case Keys.J:
                    血魔弒天();
                    break;
                case Keys.K:
                    break;
                case Keys.L:
                    break;
                case Keys.M:
                    break;
                case Keys.N:
                    break;
                case Keys.O:
                    break;
                case Keys.P:
                    break;
                case Keys.Q:
                    //下上下下z
                    噬魂封魔斬();
                    break;
                case Keys.R:
                    浴血之怒();
                    break;
                case Keys.S:
                    崩山擊();
                    break;
                case Keys.T:
                    崩山裂地斬();
                    break;
                case Keys.U:
                    break;
                case Keys.V:
                    滅世();
                    break;
                case Keys.W:
                    鮮血暴掠();
                    break;
                case Keys.X:
                    break;
                case Keys.Y:
                    一覺();
                    break;
                case Keys.Z:
                    break; 
                case Keys.Add:
                    回血();
                    break; 
                default:
                    break;
            }
        }

        private void 暴怒狂斬()
        {
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //Z
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYUP, 0);
        }

        private void 回血()
        {  //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //空格
            keybd_event(VK_SPACE, CO_SPACE, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_SPACE, CO_SPACE, KEYEVENTF_KEYUP, 0);
        }

        private void 瘋魔血魂斬()
        {
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //Z
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYUP, 0);
        }

        private void 一覺()
        {
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //Z
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYUP, 0);
        }

        private void 滅世()
        {  //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));

            //Z
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYUP, 0);
        }

        private void 崩山裂地斬()
        {
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));

            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));

            //Z
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYUP, 0);
        }

        private void 浴血之怒()
        {

            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));

            //Z
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYUP, 0);
        }

        private void 致命血隕()
        {

            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));

            //Z
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYUP, 0);
        }

        private void 鮮血暴掠()
        {
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));

            //Z
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYUP, 0);
        }

        private void 血魔弒天()
        {
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));

            //Z
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYUP, 0);
        }

        private void 封魔血魂斬()
        {
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));

            //Z
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYUP, 0);
        }

        private void 血氣爆發(fā)()
        {
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));

            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));

            //Z
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYUP, 0);
        }

        private void 怒氣爆發(fā)()
        {
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //Z
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYUP, 0);
        }

        private void 噬魂之手()
        {
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //Z
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYUP, 0);
        }

        private void 崩山擊()
        {   //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //Z
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYUP, 0);
        }

        private void 噬魂封魔斬()
        {    //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //Z
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(100, 200));
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYUP, 0);
        }

        private void 血氣之刃()
        {
            //下
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_DOWN, CO_DOWN, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));

            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //上
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYUP, 0);
            Thread.Sleep(rd.Next(40, 60));
            //Z
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYDOWN, 0);
            Thread.Sleep(rd.Next(50, 60));
            keybd_event(CO_Z, CO_Z, KEYEVENTF_KEYUP, 0);
        }
  1. 修改游戲中操作指令,所有操作都改成上下+Z 或者空格。方便把握好左右。

C# 開發(fā) DNF手搓按鍵。keybd_event 模擬鍵盤操作(重點是方向鍵模擬)
  1. 整體代碼完成,由于一開始不知道怎么使用方向鍵,所以把方向鍵改成了數(shù)字鍵盤。

  1. 重點:由于部分地圖必須使用方向鍵才能操作,又對方向鍵的使用進行了研究

? ? //增加輔助鍵盤按下值 
? ? const byte KEYEVENTF_KEYDOWNFangXiang = 1;
? ? 
? ? //方向鍵的指令改成下面這樣 
    keybd_event(VK_UP, CO_UP, KEYEVENTF_KEYDOWNFangXiang, 0);
    Thread.Sleep(rd.Next(50, 60));
    keybd_event(VK_UP, CO_UP, (KEYEVENTF_KEYDOWNFangXiang | KEYEVENTF_KEYUP), 0);
    Thread.Sleep(rd.Next(40, 60));

總結(jié):整體代碼比較簡單,就是方向鍵研究了一下。同時因為沒有適應(yīng)指令釋放技能的速度,最終只是實現(xiàn)了想要的功能進行了測試,最終被我放棄了。特此發(fā)出來分享一下。

預(yù)告:最近在研究.NET MAUI 想做一個手機操作軟件,配合向日葵遠(yuǎn)程,或者其他遠(yuǎn)程。實現(xiàn)手機玩游戲。對于我來時比較難得是APP的界面制作,由于沒有接觸過android開發(fā),步履蹣跚,有對.net MAUI 比較熟,或者對 xaml熟悉的兄弟留個言探討一下。。文章來源地址http://www.zghlxwxcb.cn/news/detail-489126.html

到了這里,關(guān)于C# 開發(fā) DNF手搓按鍵。keybd_event 模擬鍵盤操作(重點是方向鍵模擬)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • C#事件event

    C#事件event

    事件模型的5個組成部分 事件擁有者(event source)(類對象)(有些書將其稱為事件發(fā)布者) 事件成員(event)(事件擁有者的成員)(事件成員就是事件本身,事件不會主動發(fā)生,其只會在事件擁有者的內(nèi)部邏輯的觸發(fā)下發(fā)生。) 事件響應(yīng)者(event subscriber)(類對象)(有

    2024年02月09日
    瀏覽(16)
  • C#事件(event)的理解

    C#事件(event)的理解

    遇到一個開發(fā)的問題? 面試者:以面向?qū)ο蟮乃枷雽崿F(xiàn)一下的場景: 貓:Miao一聲,緊接著引發(fā)了一系列的行為~ Miao:引發(fā)了一系列的動作; 從代碼層面來說:代碼這樣寫好嗎? 貓職責(zé)不單一(貓就是貓,他的行為只有Miao一聲) 依賴太重,依賴了很多的普通類; 被依賴的類

    2024年03月09日
    瀏覽(26)
  • C# 深入理解事件(event)機制

    C# 深入理解事件(event)機制

    目錄 一,引言 二,事件的定義和用法 2.1 同步事件執(zhí)行? 2.2?異步事件執(zhí)行 2.3?等待異步事件完成 2.4?捕獲異常處理中的異常 三,事件的綜合案例 3.1 需求:汽車出停車場時收費,開閘放行 都知道事件的本質(zhì)是一個多播委托(MulticastDelegate),但對于事件的機制和用法一直懵懵

    2024年02月16日
    瀏覽(24)
  • 深入篇【C++】手搓模擬實現(xiàn)二叉搜索樹(遞歸/非遞歸版本)&&常見應(yīng)用場景(K模型與KV模型)

    深入篇【C++】手搓模擬實現(xiàn)二叉搜索樹(遞歸/非遞歸版本)&&常見應(yīng)用場景(K模型與KV模型)

    二叉搜索樹又稱二叉排序樹,它或者是一顆空樹或者是具有以下性質(zhì)的二叉樹: 1.當(dāng)它的左子樹不為空,則左子樹上所有的結(jié)點的值都要小于根節(jié)點。 2.當(dāng)它的右子樹不為空,則右子樹上所有的結(jié)點的值都要大于根結(jié)點。 3.它的左右子樹都是二叉搜索樹。 ①.定義結(jié)點 二叉樹

    2024年02月12日
    瀏覽(22)
  • c# CAD二次開發(fā) 模擬CAD移動圖形, 通過圓現(xiàn)在注記,改變圖形顏色

    c# CAD二次開發(fā) 模擬CAD移動圖形, 通過圓現(xiàn)在注記,改變圖形顏色 using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.Runtime; using System; using System.Collections.Generic; using System.Linq; using System.Text; using Application = Autodesk.AutoCAD.Applicat

    2024年02月07日
    瀏覽(33)
  • unity: C#的Action Event Delegate的異同

    目錄 一、Action 二、Event 三、Action和Event區(qū)別: 四、Delegate 總結(jié):Action Event Delegate的異同 前言: Action、Event和Delegate都是C#語言中的重要概念,分別用于管理函數(shù)指針,并且在某些情況下可以實現(xiàn)相同的目標(biāo)。 Action是一種函數(shù)指針類型,它指向一個沒有參數(shù)和返回值的函數(shù)。

    2024年02月12日
    瀏覽(24)
  • unity開發(fā)筆記#230821-手搓一個虛擬搖桿

    unity開發(fā)筆記#230821-手搓一個虛擬搖桿

    做unity游戲時,如果是做手機端則需要加一個虛擬搖桿以便玩家控制角色移動(做pc端則直接獲取鍵值即可較方便)。原理就是用Image制作一個大圓圈住一個Image小圓,玩家拖拽小圓控制角色移動。 中心思想是,以小圓中心為(0,0),獲取拖拽的偏移量即可。 首先將圖片資源拉入

    2024年02月12日
    瀏覽(87)
  • C#中的委托(Delegate)和事件 (Event)詳解與使用范例

    最近天氣晴雨不定,你因為害怕打游戲時忘記在下雨時收衣服或者在天晴時把衣服掛出去,于是你委托好友小明在天氣發(fā)生變化時打電話通知你,這就是一種委托. 下面是這種委托的實例代碼 以上代碼的輸出為 值得一提的是,如下代碼為創(chuàng)建一個繼承自Delegate類的名為XiaoMing的子類

    2023年04月12日
    瀏覽(23)
  • SSE[Server-Sent Events]實現(xiàn)頁面流式數(shù)據(jù)輸出(模擬ChatGPT流式輸出)

    SSE[Server-Sent Events]實現(xiàn)頁面流式數(shù)據(jù)輸出(模擬ChatGPT流式輸出)

    ????????服務(wù)端向客戶端推送消息,除了用WebSocket可實現(xiàn),還有一種服務(wù)器發(fā)送事件(Server-Sent Events)簡稱 SSE,這是一種服務(wù)器端到客戶端(瀏覽器)的單向消息推送。ChatGPT 就是采用的 SSE。對于需要長時間等待響應(yīng)的對話場景,ChatGPT 采用了一種巧妙的策略:它會將已經(jīng)計算

    2024年01月22日
    瀏覽(29)
  • 鼠標(biāo)驅(qū)動框架:模擬鍵盤按鍵

    裝載該驅(qū)動時,首先要卸載原本內(nèi)核自帶的驅(qū)動程序 # 把USB鼠標(biāo)查到開發(fā)板上 # 先看看原來有哪些設(shè)備節(jié)點 ls /dev/input/event* # 安裝驅(qū)動程序 insmod usbmouse_as_key.ko # 再看看新得到了哪個設(shè)備節(jié)點 ls /dev/input/event* # 執(zhí)行命令, 假設(shè)event4是新節(jié)點 hexdump /dev/input/event4 # 點擊鼠標(biāo)按鍵即

    2024年01月16日
    瀏覽(27)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包