当我尝试执行鼠标单击时,SendInput移动光标

时间:2015-03-21 19:05:05

标签: c# windows winapi sendinput

我尝试使用SendInput模拟鼠标左键单击,它可以工作,但也将光标移动到屏幕的左上角(0,0),我无法弄清楚这是为什么。

(我使用相同的结构移动光标(相对且绝对)并且正在工作。)

private static void Send(INPUT input)
{
  SendInput(1, ref input, Marshal.SizeOf(new INPUT()));
}
private static void MouseAction(MouseFlags mf)
{
  INPUT aInput = new INPUT();
  aInput.type = InputType.INPUT_MOUSE;
  aInput.mkhi.mi.dwFlags = mf;

  Send(aInput);
}

// Performs a LeftClick but moves the cursor to (0.0)
public static void LeftClick()
{
  MouseAction(MouseFlags.MOUSEEVENTF_LEFTDOWN | MouseFlags.MOUSEEVENTF_LEFTUP);
}

当我填写所有结构成员时,结果是一样的。 完整的INPUT定义:

[StructLayout(LayoutKind.Sequential)]
struct INPUT
{
    public InputType type;
    public MouseKeyboardHardwareUnion mkhi;
}
[StructLayout(LayoutKind.Explicit)]
struct MouseKeyboardHardwareUnion
{
    [FieldOffset(0)]
    public MOUSEINPUT mi;

    [FieldOffset(0)]
    public KEYBDINPUT ki;
}
[StructLayout(LayoutKind.Sequential)]
struct MOUSEINPUT
{
    public int dx;
    public int dy;
    public uint mouseData;
    public MouseFlags dwFlags;
    public uint time;
    public IntPtr dwExtraInfo;
}
// Not relevant
[StructLayout(LayoutKind.Sequential)]
struct KEYBDINPUT
{
    public KeyboardVirtual wVk;
    public ushort wScan;
    public KeyboardFlags dwFlags;
    public uint time;
    public IntPtr dwExtraInfo;
}

使用光标的当前位置填写MOUSEINPUT的dx和dy字段似乎也无法解决问题。

2 个答案:

答案 0 :(得分:1)

首先,如果您要显示INPUT结构的定义,那将非常有用。

其次,如果您的INPUT结构包含X和Y坐标,请使用以下命令设置它们:

aInput.somethingX = Cursor.Position.X;
aInput.somethingY = Cursor.Position.Y;

因为否则它当然会重置光标位置。

第三,只需搜索google和stackoverflow,你就会发现很多人已经问过这个问题并得到了this这样的有用答案。

答案 1 :(得分:0)

我想通了,问题不在于INPUT结构,我在EventArgs构造函数中调用了LeftClick()函数。我把它移到外面后就可以了。