1. 程式人生 > >C#模擬滑鼠和鍵盤操作

C#模擬滑鼠和鍵盤操作

本文旨在自己動手實現一個類似於“按鍵精靈”的桌面軟體。第一部分介紹了簡單的模擬方式,但是有些軟體能夠遮蔽掉這種簡單模擬帶來的效果,因此第二部分將介紹如何從驅動級層面進行模擬。

“遊戲外掛一般分為三個級別:初級是滑鼠、鍵盤模擬,中級是Call遊戲內部函式,讀寫記憶體,高階是抓包,封包的“離線掛”(完全模擬客戶端網路資料,不用運行遊戲)。用C#寫外掛的不是很多,大部分是C++,主要原因是MS的C#目前不支援內聯彙編功能。因此用C++寫底層庫,然後用C#呼叫成為DONET愛好者開發外掛的首選。”——某開發者言

簡單的模擬方式

模擬滑鼠操作

Windows API介紹

.NET沒有提供改變滑鼠指標位置、模擬點選操作的函式,但是可以通過呼叫Windows API函式實現。

[DllImport("user32.dll")]
static extern bool SetCursorPos(int X,int Y);

該函式用於設定滑鼠的位置,其中X和Y是相對於螢幕左上角的絕對位置.

[DllImport("user32.dll")]
static extern void mouse_event(MouseEventFlag flags,int dx,int dy,uint data,UIntPtr extraInfo);
該函式不僅可以設定滑鼠指標絕對位置,而且可以以相對座標來設定位置.

其中flags標誌位集,指定點選按鈕和滑鼠動作的多種情況.dx指滑鼠沿x軸絕對位置或上次滑鼠事件位置產生以來移動的數量.dy指沿y軸的絕對位置或從上次滑鼠事件以來移動的數量.data如果flags為MOUSE_WHEEL則該值指滑鼠輪移動的數量(否則為0),正值向前轉動.extraInfo指定與滑鼠事件相關的附加32位值.

[DllImport("user32.dll")]
static extern IntPtr FindWindow(string strClass, string strWindow);

該函式根據類名和視窗名來得到視窗控制代碼,但是這個函式不能查詢子視窗,也不區分大小寫.如果要從一個視窗的子視窗查詢需要使用FIndWindowEX函式.

[DllImport("user32.dll")]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string strClass, string strWindow);

該函式獲取一個視窗的控制代碼,該視窗的類名和視窗名與給定的字串相匹配,該函式查詢子視窗時從排在給定的子視窗後面的下一個子視窗開始。其中引數hwnParent為要查詢子視窗的父視窗控制代碼,若該值為NULL則函式以桌面視窗為父視窗,查詢桌面視窗的所有子視窗。 hwndChildAfter子視窗控制代碼,查詢從在Z序中的下一個子視窗開始,子視窗必須為hwnParent直接子視窗而非後代視窗,若hwnChildAfter為NULL,查詢從父視窗的第一個子視窗開始。 strClass指向一個指定類名的空結束字串或一個標識類名字串的成員的指標。 strWindow指向一個指定視窗名(視窗標題)的空結束字串.若為NULL則所有窗體全匹配。返回值:如果函式成功,返回值為具有指定類名和視窗名的視窗控制代碼,如果函式失敗,返回值為NULL。

實現步驟

1-引入名稱空間using System.Runtime.InteropServices; 因為要使用user32.dll中的介面。
2-建立一個新類MouseFlag
3-宣告函式 
- 此處的位置都是螢幕絕對位置 
- 設定滑鼠位置:public static extern int SetCursorPos(int x, int y); 
- 滑鼠事件:static extern void mouse_event(MouseEventFlag flags, int dx, int dy, uint data, UIntPtr extraInfo);雖然這個已經棄用了,但是上手簡單。這裡需要一個型別:MouseEventFlag
4-建立MouseEventFlag :enum MouseEventFlag : uint

5-用類包起來

實現例項

(一個控制檯程式)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

namespace Mouse
{
    class Program
    {
        public class MouseFlag
        {
            enum MouseEventFlag : uint
            {
                Move = 0x0001,
                LeftDown = 0x0002,
                LeftUp = 0x0004,
                RightDown = 0x0008,
                RightUp = 0x0010,
                MiddleDown = 0x0020,
                MiddleUp = 0x0040,
                XDown = 0x0080,
                XUp = 0x0100,
                Wheel = 0x0800,
                VirtualDesk = 0x4000,
                Absolute = 0x8000
            }

            [DllImport("user32.dll")]
            static extern void mouse_event(MouseEventFlag flags, int dx, int dy, uint data, UIntPtr extraInfo);

            [DllImport("user32.dll")]
            public static extern int SetCursorPos(int x, int y);

            public static void MouseLeftClickEvent(int dx, int dy, uint data)
            {
                SetCursorPos(dx, dy);
                System.Threading.Thread.Sleep(2 * 1000);
                mouse_event(MouseEventFlag.LeftDown, dx, dy, data, UIntPtr.Zero);
                mouse_event(MouseEventFlag.LeftUp, dx, dy, data, UIntPtr.Zero);
            }

            public static void MouseRightClickEvent(int dx, int dy, uint data)
            {
                SetCursorPos(dx, dy);
                System.Threading.Thread.Sleep(2 * 1000);
                mouse_event(MouseEventFlag.RightDown, dx, dy, data, UIntPtr.Zero);
                mouse_event(MouseEventFlag.RightUp, dx, dy, data, UIntPtr.Zero);
            }
        }

        static void Main(string[] args)
        {            
            System.Threading.Thread.Sleep(6 * 1000);
            MouseFlag.MouseLeftClickEvent(10, 1000, 0);
        }
    }
}

模擬鍵盤操作

Windows API介紹

        /// <param name="bVk" >按鍵的虛擬鍵值</param>
        /// <param name= "bScan" >掃描碼,一般不用設定,用0代替就行</param>
        /// <param name= "dwFlags" >選項標誌:0:表示按下,2:表示鬆開</param>
        /// <param name= "dwExtraInfo">一般設定為0</param>
        [DllImport("user32.dll")]
        public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

實現步驟

可類比“模擬滑鼠操作”的實現步驟,直接學習以下例項吧。

實現例項

(一個控制檯程式)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;

namespace VKB
{
    class Program
    {
        public class KeyBoard
        {
            public const byte vKeyLButton = 0x1;    // 滑鼠左鍵
            public const byte vKeyRButton = 0x2;    // 滑鼠右鍵
            public const byte vKeyCancel = 0x3;     // CANCEL 鍵
            public const byte vKeyMButton = 0x4;    // 滑鼠中鍵
            public const byte vKeyBack = 0x8;       // BACKSPACE 鍵
            public const byte vKeyTab = 0x9;        // TAB 鍵
            public const byte vKeyClear = 0xC;      // CLEAR 鍵
            public const byte vKeyReturn = 0xD;     // ENTER 鍵
            public const byte vKeyShift = 0x10;     // SHIFT 鍵
            public const byte vKeyControl = 0x11;   // CTRL 鍵
            public const byte vKeyAlt = 18;         // Alt 鍵  (鍵碼18)
            public const byte vKeyMenu = 0x12;      // MENU 鍵
            public const byte vKeyPause = 0x13;     // PAUSE 鍵
            public const byte vKeyCapital = 0x14;   // CAPS LOCK 鍵
            public const byte vKeyEscape = 0x1B;    // ESC 鍵
            public const byte vKeySpace = 0x20;     // SPACEBAR 鍵
            public const byte vKeyPageUp = 0x21;    // PAGE UP 鍵
            public const byte vKeyEnd = 0x23;       // End 鍵
            public const byte vKeyHome = 0x24;      // HOME 鍵
            public const byte vKeyLeft = 0x25;      // LEFT ARROW 鍵
            public const byte vKeyUp = 0x26;        // UP ARROW 鍵
            public const byte vKeyRight = 0x27;     // RIGHT ARROW 鍵
            public const byte vKeyDown = 0x28;      // DOWN ARROW 鍵
            public const byte vKeySelect = 0x29;    // Select 鍵
            public const byte vKeyPrint = 0x2A;     // PRINT SCREEN 鍵
            public const byte vKeyExecute = 0x2B;   // EXECUTE 鍵
            public const byte vKeySnapshot = 0x2C;  // SNAPSHOT 鍵
            public const byte vKeyDelete = 0x2E;    // Delete 鍵
            public const byte vKeyHelp = 0x2F;      // HELP 鍵
            public const byte vKeyNumlock = 0x90;   // NUM LOCK 鍵

            //常用鍵 字母鍵A到Z
            public const byte vKeyA = 65;
            public const byte vKeyB = 66;
            public const byte vKeyC = 67;
            public const byte vKeyD = 68;
            public const byte vKeyE = 69;
            public const byte vKeyF = 70;
            public const byte vKeyG = 71;
            public const byte vKeyH = 72;
            public const byte vKeyI = 73;
            public const byte vKeyJ = 74;
            public const byte vKeyK = 75;
            public const byte vKeyL = 76;
            public const byte vKeyM = 77;
            public const byte vKeyN = 78;
            public const byte vKeyO = 79;
            public const byte vKeyP = 80;
            public const byte vKeyQ = 81;
            public const byte vKeyR = 82;
            public const byte vKeyS = 83;
            public const byte vKeyT = 84;
            public const byte vKeyU = 85;
            public const byte vKeyV = 86;
            public const byte vKeyW = 87;
            public const byte vKeyX = 88;
            public const byte vKeyY = 89;
            public const byte vKeyZ = 90;

            //數字鍵盤0到9
            public const byte vKey0 = 48;    // 0 鍵
            public const byte vKey1 = 49;    // 1 鍵
            public const byte vKey2 = 50;    // 2 鍵
            public const byte vKey3 = 51;    // 3 鍵
            public const byte vKey4 = 52;    // 4 鍵
            public const byte vKey5 = 53;    // 5 鍵
            public const byte vKey6 = 54;    // 6 鍵
            public const byte vKey7 = 55;    // 7 鍵
            public const byte vKey8 = 56;    // 8 鍵
            public const byte vKey9 = 57;    // 9 鍵


            public const byte vKeyNumpad0 = 0x60;    //0 鍵
            public const byte vKeyNumpad1 = 0x61;    //1 鍵
            public const byte vKeyNumpad2 = 0x62;    //2 鍵
            public const byte vKeyNumpad3 = 0x63;    //3 鍵
            public const byte vKeyNumpad4 = 0x64;    //4 鍵
            public const byte vKeyNumpad5 = 0x65;    //5 鍵
            public const byte vKeyNumpad6 = 0x66;    //6 鍵
            public const byte vKeyNumpad7 = 0x67;    //7 鍵
            public const byte vKeyNumpad8 = 0x68;    //8 鍵
            public const byte vKeyNumpad9 = 0x69;    //9 鍵
            public const byte vKeyMultiply = 0x6A;   // MULTIPLICATIONSIGN(*)鍵
            public const byte vKeyAdd = 0x6B;        // PLUS SIGN(+) 鍵
            public const byte vKeySeparator = 0x6C;  // ENTER 鍵
            public const byte vKeySubtract = 0x6D;   // MINUS SIGN(-) 鍵
            public const byte vKeyDecimal = 0x6E;    // DECIMAL POINT(.) 鍵
            public const byte vKeyDivide = 0x6F;     // DIVISION SIGN(/) 鍵


            //F1到F12按鍵
            public const byte vKeyF1 = 0x70;   //F1 鍵
            public const byte vKeyF2 = 0x71;   //F2 鍵
            public const byte vKeyF3 = 0x72;   //F3 鍵
            public const byte vKeyF4 = 0x73;   //F4 鍵
            public const byte vKeyF5 = 0x74;   //F5 鍵
            public const byte vKeyF6 = 0x75;   //F6 鍵
            public const byte vKeyF7 = 0x76;   //F7 鍵
            public const byte vKeyF8 = 0x77;   //F8 鍵
            public const byte vKeyF9 = 0x78;   //F9 鍵
            public const byte vKeyF10 = 0x79;  //F10 鍵
            public const byte vKeyF11 = 0x7A;  //F11 鍵
            public const byte vKeyF12 = 0x7B;  //F12 鍵

            [DllImport("user32.dll")]
            public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);

            public static void keyPress(byte keyName)
            {
                KeyBoard.keybd_event(keyName, 0, 0, 0);
                KeyBoard.keybd_event(keyName, 0, 2, 0);
            }
        }

        static void Main(string[] args)
        {            
            System.Threading.Thread.Sleep(6 * 1000);
            ///MouseFlag.MouseLeftClickEvent(350, 70, 0);
            ///System.Threading.Thread.Sleep(5*1000);
            ///MouseFlag.MouseLeftClickEvent(20, 30, 0);
            ///System.Threading.Thread.Sleep(5 * 1000);
            KeyBoard.keyPress(KeyBoard.vKeyBack);
            System.Threading.Thread.Sleep(5 * 1000);
        }
    }
}

驅動級模擬

介紹

有時候,按照上面說的方式進行模擬會失敗,桌面軟體尤其是一些遊戲,對於訊息命令一點也不“服從”,我們有這樣的疑問:它是如何識別真實鍵盤的按鍵的呢?難道是程式中有判斷嗎?在DirectX程式設計中有個叫DirectInput的API,就是它繞過了Windows的訊息機制,它的目的是為了讓軟體(遊戲)的實時性控制更好、更快。Windows訊息是佇列形式的,在傳遞過程中會有延時,比如即時對戰類遊戲對實時性控制要求是非常高的,Window訊息機制不能滿足這個需求。而DirectInput直接和鍵盤驅動程式打交道,效率當然要高出一大截。

那麼怎麼解決這個問題呢,有人發現“按鍵精靈”使用了WINIO驅動的原理。於是我們也可以通過WINIO實現這樣的模擬。

注意要使用winio.dll這個動態庫,是需要一些條件的:

1- WinIO函式庫只允許被具有管理者許可權的應用程式呼叫。如果使用者不是以管理者的身份進入的,則WinIO.DLL不能夠被安裝,也不能啟用WinIO驅動器。通過在管理者許可權下安裝驅動器軟體就可以克服這種限制。然而,在這種情況下,ShutdownWinIo函式不能在應用程式結束之前被呼叫,因為該函式將WinIO驅動程式從系統登錄檔中刪除。

2- 64位作業系統下需要將WinIo.sys驅動檔案新增數字簽名。

3- 注意WinIo.sys和WinIo.dll這兩個檔案的存放路徑,如果路徑不對,會導致初始化失敗。

可能遇到各種麻煩,請耐心解決。

實現例項

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace lizheAionWG
{
    public class WinIo
    {
        public const int KBC_KEY_CMD = 0x64;
        public const int KBC_KEY_DATA = 0x60;
        [DllImport("winio.dll")]
        public static extern bool InitializeWinIo();
        [DllImport("winio.dll")]
        public static extern bool GetPortVal(IntPtr wPortAddr, out int pdwPortVal, byte bSize);
        [DllImport("winio.dll")]
        public static extern bool SetPortVal(uint wPortAddr, IntPtr dwPortVal, byte bSize);
        [DllImport("winio.dll")]
        public static extern byte MapPhysToLin(byte pbPhysAddr, uint dwPhysSize, IntPtr PhysicalMemoryHandle);
        [DllImport("winio.dll")]
        public static extern bool UnmapPhysicalMemory(IntPtr PhysicalMemoryHandle, byte pbLinAddr);
        [DllImport("winio.dll")]
        public static extern bool GetPhysLong(IntPtr pbPhysAddr, byte pdwPhysVal);
        [DllImport("winio.dll")]
        public static extern bool SetPhysLong(IntPtr pbPhysAddr, byte dwPhysVal);
        [DllImport("winio.dll")]
        public static extern void ShutdownWinIo();
        [DllImport("user32.dll")]
        public static extern int MapVirtualKey(uint Ucode, uint uMapType);
        public void sendwinio()
        {
            if (InitializeWinIo())
            {
                KBCWait4IBE();
            }
        }
        ///Wait for Buffer gets empty
        private void KBCWait4IBE()
        {
            int dwVal = 0;
            do
            {
                bool flag = GetPortVal((IntPtr)0x64, out dwVal, 1);
            }
            while ((dwVal & 0x2) > 0);
        }
        /// key down
        public void MykeyDown(int vKeyCoad)
        {
            int btScancode = 0;
            btScancode = MapVirtualKey((byte)vKeyCoad, 0);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)0xe2, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)btScancode, 1);
        }
        /// Key up
        public void MykeyUp(int vKeyCoad)
        {
            int btScancode = 0;
            btScancode = MapVirtualKey((byte)vKeyCoad, 0);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)0xe0, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD2, 1);
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)btScancode, 1);
        }
        /// Simulate mouse down
        public void MyMouseDown(int vKeyCoad)
        {
            int btScancode = 0;
            btScancode = MapVirtualKey((byte)vKeyCoad, 0);
            KBCWait4IBE(); // 'wait for buffer gets empty
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD3, 1);// 'send write command
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)(btScancode | 0x80), 1);// 'write in io
        }
        /// Simulate mouse up
        public void MyMouseUp(int vKeyCoad)
        {
            int btScancode = 0;
            btScancode = MapVirtualKey((byte)vKeyCoad, 0);
            KBCWait4IBE(); // 'wait for buffer gets empty
            SetPortVal(KBC_KEY_CMD, (IntPtr)0xD3, 1); //'send write command
            KBCWait4IBE();
            SetPortVal(KBC_KEY_DATA, (IntPtr)(btScancode | 0x80), 1);// 'write in io
        }
        //----------------------------------------------------------------------------------
        //VK codes
        //----------------------------------------------------------------------------------
        public enum Key
        {
            // mouse movements
            move = 0x0001,
            leftdown = 0x0002,
            leftup = 0x0004,
            rightdown = 0x0008,
            rightup = 0x0010,
            middledown = 0x0020,
            //keyboard stuff
            VK_LBUTTON = 1,
            VK_RBUTTON = 2,
            VK_CANCEL = 3,
            VK_MBUTTON = 4,
            VK_BACK = 8,
            VK_TAB = 9,
            VK_CLEAR = 12,
            VK_RETURN = 13,
            VK_SHIFT = 16,
            VK_CONTROL = 17,
            VK_MENU = 18,
            VK_PAUSE = 19,
            VK_CAPITAL = 20,
            VK_ESCAPE = 27,
            VK_SPACE = 32,
            VK_PRIOR = 33,
            VK_NEXT = 34,
            VK_END = 35,
            VK_HOME = 36,
            VK_LEFT = 37,
            VK_UP = 38,
            VK_RIGHT = 39,
            VK_DOWN = 40,
            VK_SELECT = 41,
            VK_PRINT = 42,
            VK_EXECUTE = 43,
            VK_SNAPSHOT = 44,
            VK_INSERT = 45,
            VK_DELETE = 46,
            VK_HELP = 47,
            VK_NUM0 = 48, //0
            VK_NUM1 = 49, //1
            VK_NUM2 = 50, //2
            VK_NUM3 = 51, //3
            VK_NUM4 = 52, //4
            VK_NUM5 = 53, //5
            VK_NUM6 = 54, //6
            VK_NUM7 = 55, //7
            VK_NUM8 = 56, //8
            VK_NUM9 = 57, //9
            VK_A = 65, //A
            VK_B = 66, //B
            VK_C = 67, //C
            VK_D = 68, //D
            VK_E = 69, //E
            VK_F = 70, //F
            VK_G = 71, //G
            VK_H = 72, //H
            VK_I = 73, //I
            VK_J = 74, //J
            VK_K = 75, //K
            VK_L = 76, //L
            VK_M = 77, //M
            VK_N = 78, //N
            VK_O = 79, //O
            VK_P = 80, //P
            VK_Q = 81, //Q
            VK_R = 82, //R
            VK_S = 83, //S
            VK_T = 84, //T
            VK_U = 85, //U
            VK_V = 86, //V
            VK_W = 87, //W
            VK_X = 88, //X
            VK_Y = 89, //Y
            VK_Z = 90, //Z
            VK_NUMPAD0 = 96, //0
            VK_NUMPAD1 = 97, //1
            VK_NUMPAD2 = 98, //2
            VK_NUMPAD3 = 99, //3
            VK_NUMPAD4 = 100, //4
            VK_NUMPAD5 = 101, //5
            VK_NUMPAD6 = 102, //6
            VK_NUMPAD7 = 103, //7
            VK_NUMPAD8 = 104, //8
            VK_NUMPAD9 = 105, //9
            VK_NULTIPLY = 106,
            VK_ADD = 107,
            VK_SEPARATOR = 108,
            VK_SUBTRACT = 109,
            VK_DECIMAL = 110,
            VK_DIVIDE = 111,
            VK_F1 = 112,
            VK_F2 = 113,
            VK_F3 = 114,
            VK_F4 = 115,
            VK_F5 = 116,
            VK_F6 = 117,
            VK_F7 = 118,
            VK_F8 = 119,
            VK_F9 = 120,
            VK_F10 = 121,
            VK_F11 = 122,
            VK_F12 = 123,
            VK_NUMLOCK = 144,
            VK_SCROLL = 145,
            middleup = 0x0040,
            xdown = 0x0080,
            xup = 0x0100,
            wheel = 0x0800,
            virtualdesk = 0x4000,
            absolute = 0x8000
        }
    }
}
某開發者自己封裝了一個dll動態庫,可參考這篇博文:點選開啟連結

實際上,github上有許多類似的東西,可以找找合適的程式碼。

參考資料

相關推薦

C#模擬滑鼠鍵盤操作

本文旨在自己動手實現一個類似於“按鍵精靈”的桌面軟體。第一部分介紹了簡單的模擬方式,但是有些軟體能夠遮蔽掉這種簡單模擬帶來的效果,因此第二部分將介紹如何從驅動級層面進行模擬。“遊戲外掛一般分為三個級別:初級是滑鼠、鍵盤模擬,中級是Call遊戲內部函式,讀寫記憶體,高階是抓包,

C# WPF 中用程式碼模擬滑鼠鍵盤操作

  原文地址   C#開發者都知道,在Winform開發中,SendKeys類提供的方法是很實用的。但是可惜的是,在WPF中不能使用這個方法了。   我們知道,在WPF中非UI執行緒重新整理UI執行

自動化滑鼠鍵盤操作pyautogui

一  pyautogui模組簡要說明 ## 使用 pyautogui 模組相關函式,可以模擬滑鼠及鍵盤操作, 完整說明文件見: http://pyautogui.readthedocs.org/ # pip install pyautogui # 要注意的是,模擬移動滑鼠與擊

pyautogui自動化控制滑鼠鍵盤操作

pyautogui自動化控制滑鼠和鍵盤操作 安裝 pyautogui滑鼠操作樣例 pyautogui鍵盤操作樣例 按鍵支援 提示資訊 alert option password prompt

selenium中模擬滑鼠鍵盤操作

首先要重寫一個WebDriverEventListener的介面類 1.模擬滑鼠操作 EventFiringMouse mouse = new EventFiringMouse(driver, webDriverEventListener); EventFiringTouch touch

Java中模擬滑鼠鍵盤輸入

{private Robot robot =null;public RobotDemo() ...{   try...{    robot =new Robot();   }catch (AWTException e) ...{    e.printStackTrace();   }}/** *//** 可以

C++實現滑鼠控制 封裝常見的模擬滑鼠鍵盤操作函式

API 或 MFC 視窗程式 裡 有 函式, 例如 API 函式 設位置: BOOL SetCursorPos( int x, int y); 引數是螢幕座標x,y 標頭檔案 Winuser.h 連結庫 #pragma comment (lib, "User32.lib") 或取位

C# 模擬 滑鼠 鍵盤操作

一.封裝一個Io_Api 類 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServic

[python] PyMouse、PyKeyboard用python操作滑鼠鍵盤

  1、PyUserInput 簡介 PyUserInput是一個使用python的跨平臺的操作滑鼠和鍵盤的模組,非常方便使用。支援的平臺及依賴如下: Linux - Xlib Mac - Quartz, AppKit Windows - pywin32, pyHook 支

python教程:PyMouse、PyKeyboard用python操作滑鼠鍵盤

  1、PyUserInput 簡介 PyUserInput是一個使用python的跨平臺的操作滑鼠和鍵盤的模組,非常方便使用。支援的平臺及依賴如下: Linux - Xlib Mac - Quartz, AppKit Windows - pywin

(轉)python selenium-webdriver 元素操作滑鼠鍵盤事件

參考資料:https://blog.csdn.net/zh175578809/article/details/76767748 參考資料2:https://blog.csdn.net/qq_41817302/article/details/79618654   selenium 提供了比較完整的鍵盤操作,

模擬滑鼠模擬鍵盤

模擬滑鼠 void __fastcall TForm1::Button1Click(TObject *Sender) { HWND h,h1; TRect rc; int i,j; Sleep(500); h1=GetDesktopWindow();

python自動化滑鼠鍵盤PyUserInput(pymousepykeyboard)

引 在使用電腦的時候,偶爾有需求要模擬滑鼠鍵盤,進行一些機械重複的操作(重新整理網頁、搶票、某些小遊戲等)。如果為此專門下載一個按鍵精靈,總感覺殺雞用牛刀,所以就開始探索一些輕量級解決方案。本人電腦上配置了Python,自然就想到那句名言 方案 參考網上的各種例子後,發現了PyUse

用GUI 自動化控制滑鼠鍵盤

GUI自動化,被稱為 ‘圖形使用者介面自動化’。有人調侃過,有了GUI自動化,你的程式就像一個活人使用者坐在計算機面前,能做任何事情,除了將咖啡潑在鍵盤上。 安裝 pyautogui 模組 pyautogui模組可以向Windows,OS X 和Linux傳送虛擬的鍵盤和滑鼠點。

WebDriver滑鼠鍵盤操作

1. 滑鼠事件 說明:WebDriver庫對模擬滑鼠操作封裝的一些方法,此知識點作為了解 WebDriver操作滑鼠方法 說明:在WebDriver中將操作滑鼠的方法封裝在ActionChains類中 1. context_click() 右擊 --> 此方

重灌系統時,USB介面滑鼠鍵盤不能使用的解決辦法

重灌系統時,USB介面滑鼠和鍵盤不能使用的解決辦法 有時重灌系統時,發現USB滑鼠和鍵盤都不能用,導致無法裝驅動等操作,安全模式也進入不了,這個是怎麼回事呢? 因為鍵盤是USB插口的,因為沒進入系統的時候USB還無法實現資料傳輸。建議使用普通的圓口的,如果沒有圓口滑鼠,就請重新設定bios裡

遮蔽OTG 滑鼠鍵盤,只支援OTG U盤

kernel-4.4/drivers/hid/usbhid/hid-core.c static int usbhid_probe(struct usb_interface *intf, const struct usb_device_id * dbg_h

全網最詳細的一款滿足多臺電腦共用一個滑鼠鍵盤的工具Synergy(圖文詳解)

   不多說,直接上乾貨!  前言          如今無論你是在公司做大資料開發還是實驗室裡搞科研,這個軟體確實好用,作為正在通往大資料架構師路上的我們沒有幾臺電腦怎麼行?桌上型電腦、筆記本,都放在寫字檯上,筆記本內建鍵盤滑鼠,桌上型電腦則有一套無線鍵鼠。經常需要多臺切換使用,這時椅子

c# 禁用滑鼠鍵盤

禁用滑鼠與鍵盤有兩種方法: 直接呼叫禁用API(缺點:按Ctrl+alt+delete,禁用會失效) ① 幫助類 public class BlockHelper { private static Logger<

iOS開發—執行緒的模擬暫停繼續操作

表檢視開啟執行緒下載遠端的網路介面,滾動頁面時勢必會有影響,降低使用者的體驗。針對這種情況,當用戶滾動螢幕的時候,暫停佇列;使用者停止滾動的時候,繼續恢復佇列。接下來通過一個案例,演示如何暫停和繼續操作,具體內容如下: (1)新建一個SingleViewApplicatio