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,我还没有找到恢复它的方法.
移动物理鼠标会带回光标,点击工作正常.
我怎样才能恢复鼠标,让鼠标再次在这里工作?
使用APISendInput来模拟鼠标输入。
\n\n\nPInvoke to SendInput \xe2\x80\x93 这是模拟输入的官方方法。它将输入推送到所有预期的代码路径,并且与真实输入无法区分。
\n
这是代码示例:
\n\npublic 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}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
145 次 |
| 最近记录: |