c# SendInput模擬輸入字符和按鍵


介紹:

  該程序本意是為了在彩六里打中文用的,現整理出來供大家復制粘貼。(源程序已開源至GitHub - 彩六中文輸入

  主要使用SendInput函數,與c語言中用法一致。(部分代碼來自網絡)

 

命名空間部分

using static System.Threading.Thread;
using System.Runtime.InteropServices;

結構體和函數聲明部分

[StructLayout(LayoutKind.Explicit)]
        public struct INPUT
        {
            [FieldOffset(0)]
            public int type;
            [FieldOffset(4)]
            public KEYBDINPUT ki;
            [FieldOffset(4)]
            public MOUSEINPUT mi;
            [FieldOffset(4)]
            public HARDWAREINPUT hi;
        }
        public struct MOUSEINPUT
        {
            public int dx;
            public int dy;
            public int mouseData;
            public int dwFlags;
            public int time;
            public IntPtr dwExtraInfo;
        }
        public struct KEYBDINPUT
        {
            public short wVk;
            public short wScan;
            public int dwFlags;
            public int time;
            public IntPtr dwExtraInfo;
        }
        public struct HARDWAREINPUT
        {
            public int uMsg;
            public short wParamL;
            public short wParamH;
        }

        [DllImport("user32")]
        public static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);

自定義函數封裝部分

public void SimulateInputString(char c)
        {
            INPUT[] input = new INPUT[2];
                
            input[0].type = 1;
            input[0].ki.wVk = 0;//dwFlags 為KEYEVENTF_UNICODE 即4時,wVk必須為0
            input[0].ki.wScan = (short)c;
            input[0].ki.dwFlags = 4;//輸入UNICODE字符
            input[0].ki.time = 0;
            input[0].ki.dwExtraInfo = IntPtr.Zero;
            input[1].type = 1;
            input[1].ki.wVk = 0;
            input[1].ki.wScan = (short)c;
            input[1].ki.dwFlags = 6;
            input[1].ki.time = 0;
            input[1].ki.dwExtraInfo = IntPtr.Zero;
            SendInput(2u, input, Marshal.SizeOf((object)default(INPUT)));
            
        }

        public void SimulateInputKey(int key)
        {
            INPUT[] input = new INPUT[1];

            input[0].type = 1;//模擬鍵盤
            input[0].ki.wVk = (short)key;
            input[0].ki.dwFlags = 0;//按下
            SendInput(1u, input, Marshal.SizeOf((object)default(INPUT)));
            Sleep(50);

            input[0].type = 1;//模擬鍵盤
            input[0].ki.wVk = (short)key;
            input[0].ki.dwFlags = 2;//抬起
            SendInput(1u, input, Marshal.SizeOf((object)default(INPUT)));
            Sleep(50);
        }

說明:

SimulateInputString為發送單個字符文本;

SimulateInputKey為模擬按鍵按下和抬起,參數key為虛擬鍵碼;
關於鍵碼的列表,可以查看微軟文檔:https://docs.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM