触摸注入后恢复被抑制的光标

Joh*_*son 7 c# windows wpf pinvoke winapi

我正在编写一个帮助器,用于在使用InjectTouchInput的 UI测试中注入触摸.

注入的触摸工作正常,但触摸后无法注入鼠标输入.

Mouse.Click(point); // works
Touch.Tap(point); // works
Mouse.Click(point); // does not work, mouse cursor no longer visible on screen.
Run Code Online (Sandbox Code Playgroud)

调用GetCursorInfo()显示光标是CURSOR_SUPPRESSED,我还没有找到恢复它的方法.

移动物理鼠标会带回光标,点击工作正常.

我怎样才能恢复鼠标,让鼠标再次在这里工作?

Dra*_*SFT 1

使用APISendInput​​来模拟鼠标输入。

\n\n
\n

PInvoke to SendInput \xe2\x80\x93 这是模拟输入的官方方法。它将输入推送到所有预期的代码路径,并且与真实输入无法区分。

\n
\n\n

这是代码示例:

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