Restore suppressed cursor after touch injection Restore suppressed cursor after touch injection wpf wpf

Restore suppressed cursor after touch injection


Use the API SendInput to Simulated mouse input.

PInvoke to SendInput – this is the official way to simulate input. It pushes the input through all of the expected code paths, and is indistinguishable from real input.

Here is the code sample:

public class MouseSimulator{    [DllImport("user32.dll", SetLastError = true)]    static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);    [StructLayout(LayoutKind.Sequential)]    struct INPUT    {        public SendInputEventType type;        public MouseKeybdhardwareInputUnion mkhi;    }    [StructLayout(LayoutKind.Explicit)]    struct MouseKeybdhardwareInputUnion    {        [FieldOffset(0)]        public MouseInputData mi;        [FieldOffset(0)]        public KEYBDINPUT ki;        [FieldOffset(0)]        public HARDWAREINPUT hi;    }    [StructLayout(LayoutKind.Sequential)]    struct KEYBDINPUT    {        public ushort wVk;        public ushort wScan;        public uint dwFlags;        public uint time;        public IntPtr dwExtraInfo;    }    [StructLayout(LayoutKind.Sequential)]    struct HARDWAREINPUT    {        public int uMsg;        public short wParamL;        public short wParamH;    }    struct MouseInputData    {        public int dx;        public int dy;        public uint mouseData;        public MouseEventFlags dwFlags;        public uint time;        public IntPtr dwExtraInfo;    }    [Flags]    enum MouseEventFlags : uint    {        MOUSEEVENTF_MOVE = 0x0001,        MOUSEEVENTF_LEFTDOWN = 0x0002,        MOUSEEVENTF_LEFTUP = 0x0004,        MOUSEEVENTF_RIGHTDOWN = 0x0008,        MOUSEEVENTF_RIGHTUP = 0x0010,        MOUSEEVENTF_MIDDLEDOWN = 0x0020,        MOUSEEVENTF_MIDDLEUP = 0x0040,        MOUSEEVENTF_XDOWN = 0x0080,        MOUSEEVENTF_XUP = 0x0100,        MOUSEEVENTF_WHEEL = 0x0800,        MOUSEEVENTF_VIRTUALDESK = 0x4000,        MOUSEEVENTF_ABSOLUTE = 0x8000    }    enum SendInputEventType : int    {        InputMouse,        InputKeyboard,        InputHardware    }    public static void MoveMouseButton(int x, int y)    {        INPUT mouseMoveInput = new INPUT();        mouseMoveInput.type = SendInputEventType.InputMouse;        mouseMoveInput.mkhi.mi.dwFlags = MouseEventFlags.MOUSEEVENTF_MOVE| MouseEventFlags.MOUSEEVENTF_ABSOLUTE;        mouseMoveInput.mkhi.mi.dx = x;          mouseMoveInput.mkhi.mi.dy = y;          SendInput(1, ref mouseMoveInput, Marshal.SizeOf(new INPUT()));    }}