【问题标题】:Directing mouse events [DllImport("user32.dll")] click, double click引导鼠标事件[DllImport("user32.dll")]点击、双击
【发布时间】:2012-02-03 02:26:15
【问题描述】:

我试过了 [DllImport("user32.dll")] static extern bool SetCursorPos(int X, int Y);

而且它可以很好地将光标移动到所需的点。我以前从未尝试过这种 DLL 导入,但它可以工作:)。但是我想要更多我还能提取什么? 主要是我想在没有任何鼠标输入的情况下双击、单击或使用滚轮选项,只是代码我该怎么做?以及如何检查 user32dll 中还包含什么?

感谢

【问题讨论】:

  • 您可能感兴趣的主题是UI Automation in .NET。 -- 另外,请记住,这些 X 和 Y 位置位于物理屏幕坐标中(仅与 96 DPI 的逻辑坐标相同——但对于其他 DPI,它们不是——大多数 .NET Framework 使用逻辑坐标一切)。

标签: c# user32


【解决方案1】:
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, UIntPtr dwExtraInfo);
private const uint MOUSEEVENTF_LEFTDOWN = 0x02;
private const uint MOUSEEVENTF_LEFTUP = 0x04;
private const uint MOUSEEVENTF_RIGHTDOWN = 0x08;
private const uint MOUSEEVENTF_RIGHTUP = 0x10;

您应该导入和定义这些常量以使用 Win32API 与鼠标一起使用

使用下面的方法进行鼠标操作

void sendMouseRightclick(Point p)
{
    mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, p.X, p.Y, 0, 0);
}

void sendMouseDoubleClick(Point p)
{
    mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, p.X, p.Y, 0, 0);

Thread.Sleep(150);

    mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, p.X, p.Y, 0, 0);
}

void sendMouseRightDoubleClick(Point p)
{
    mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, p.X, p.Y, 0, 0);

    Thread.Sleep(150);

    mouse_event(MOUSEEVENTF_RIGHTDOWN | MOUSEEVENTF_RIGHTUP, p.X, p.Y, 0, 0);
}

void sendMouseDown()
{
    mouse_event(MOUSEEVENTF_LEFTDOWN, 50, 50, 0, 0);
}

void sendMouseUp()
{
    mouse_event(MOUSEEVENTF_LEFTUP, 50, 50, 0, 0);
}

如果你想进行鼠标拖动,你应该首先发送 MouseDown(Mouse Click) 并在更改鼠标位置时保持点击状态,而不是发送 MouseUp(Release Click) 之类的东西。

sendMouseDown();
Cursor.Position = new Point(30,30);
sendMouseUp();

【讨论】:

  • 附加信息:对 PInvoke 函数 'KinectHandTracking!KinectHandTracking.MainWindow::mouse_event' 的调用使堆栈失衡。这可能是因为托管 PInvoke 签名与非托管目标签名不匹配。检查 PInvoke 签名的调用约定和参数是否与目标非托管签名匹配。
  • 顺便说一下 longs 应该是 uint 否则它会给出异常。
  • 仅供参考,您不应将Cursor.Position(适用于逻辑坐标)与User32SetCursorPos(适用于物理坐标)混用。这是一篇关于屏幕缩放和 UI 自动化的 MSDN 文章:msdn.microsoft.com/en-us/library/aa970067(v=vs.110).aspx
  • 另外,long 给出了一个例外,因为它是 64 位的,uint 工作因为它是 32 位 - 但它不适用于负坐标(这是常见的监视器设置在 Windows 中)。而不是使用longuint,您应该使用常规的int 类型。
  • 你应该用int dwExtraInfo声明mouse_event否则你的示例代码将无法编译。
【解决方案2】:

使用长类型会引发“PInvoke”错误。

我们应该使用int类型:

[DllImport("user32.dll")]
static extern void mouse_event(int dwFlags, int dx, int dy, 
                      int dwData, int dwExtraInfo);

[Flags]
public enum MouseEventFlags
{
    LEFTDOWN = 0x00000002,
    LEFTUP = 0x00000004,
    MIDDLEDOWN = 0x00000020,
    MIDDLEUP = 0x00000040,
    MOVE = 0x00000001,
    ABSOLUTE = 0x00008000,
    RIGHTDOWN = 0x00000008,
    RIGHTUP = 0x00000010
}

public static void LeftClick(int x, int y)
{
    Cursor.Position = new System.Drawing.Point(x, y);
    mouse_event((int)(MouseEventFlags.LEFTDOWN), 0, 0, 0, 0);
    mouse_event((int)(MouseEventFlags.LEFTUP), 0, 0, 0, 0);
}

来源:http://www.pinvoke.net/default.aspx/user32.mouse_event

【讨论】:

    【解决方案3】:

    查看pinvoke.net 以获取可用 API 的列表。包括代码示例和导入语句。您还可以展开左侧的选择以查看每个 DLL 的可用 API。

    【讨论】:

      猜你喜欢
      • 2012-02-01
      • 2012-03-23
      • 1970-01-01
      • 1970-01-01
      • 2019-02-09
      • 2012-01-14
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多