【问题标题】:Sending a Mouse Click to a Specific Position without Moving the Mouse在不移动鼠标的情况下将鼠标点击发送到特定位置
【发布时间】:2010-11-17 13:00:54
【问题描述】:

我希望在不影响鼠标光标位置的情况下将鼠标点击发送到屏幕上的特定位置。

我已经用 mouse_event 搜索并尝试了所有在阳光下的东西(应该这样做)

mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);

但是,这最终只会将鼠标单击发送到鼠标所在的位置。所以我最终不得不移动鼠标才能让它工作。

Cursor.Position = new Point(X, Y);

任何人都知道如何在不移动鼠标的情况下做到这一点?我也尝试了以下代码块,但没有成功,因为它仍然只单击鼠标光标位置的位置,这真的让我陷入了一个循环,因为我认为这会奏效......

        Cursor.Position = new Point(X, Y);
        mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
        Cursor.Position = new Point(oldX, oldY);

提前感谢您的帮助!

【问题讨论】:

标签: .net events mouse click simulate


【解决方案1】:

您没有包含 MOUSEEVENTF_MOVE 标志,因此光标不会移动。

我建议进行 3 个不同的调用(移动、向下、向上),同时做所有事情是不确定的。但可能会奏效,如果你真的想减少它,请尝试一下。顺便说一句,SendInput 是 SDK 建议您使用的。

【讨论】:

    【解决方案2】:

    您可能将鼠标点击发送到错误的位置。 mouse_event 采用米奇中的 X 和 Y 值,如文档 here 中所述。

    尝试使用以下方式转换您的位置:

    private static Point ScreenLocationToMickeyLocation( Point mouseLocation )
    {
        Rectangle virtualScreen = SystemInformation.VirtualScreen;
    
        return new Point(
            ( ( mouseLocation.X - virtualScreen.X ) * 65535 ) / virtualScreen.Width,
            ( ( mouseLocation.Y - virtualScreen.Y ) * 65535 ) / virtualScreen.Height );
    }
    

    【讨论】:

      【解决方案3】:

      您可能想尝试捕获鼠标的当前位置,将鼠标移动到您希望它单击的位置,单击该位置,然后将鼠标移回。如果这完成得足够快,它看起来就像鼠标没有移动。

      【讨论】:

      • 您手头是否有示例代码来演示如何快速移动鼠标 - 甚至可以使用临时不可见的鼠标指针?
      • 这不起作用,因为使用win API的“点击”有一定的延迟,不要指望这种方法。永远。
      【解决方案4】:

      visual basic 2015 社区声明

      导入 System.Runtime.InteropServices

      <Flags()>
      Public Enum MouseEventFlags As UInteger
          MOUSEEVENTF_ABSOLUTE = &H8000
          MOUSEEVENTF_LEFTDOWN = &H2
          MOUSEEVENTF_LEFTUP = &H4
          MOUSEEVENTF_MIDDLEDOWN = &H20
          MOUSEEVENTF_MIDDLEUP = &H40
          MOUSEEVENTF_MOVE = &H1
          MOUSEEVENTF_RIGHTDOWN = &H8
          MOUSEEVENTF_RIGHTUP = &H10
          MOUSEEVENTF_XDOWN = &H80
          MOUSEEVENTF_XUP = &H100
          MOUSEEVENTF_WHEEL = &H800
          MOUSEEVENTF_HWHEEL = &H1000
      End Enum
      
      Dim pntapi As POINTAPI
      Declare Function GetCursorPos Lib "user32" Alias "GetCursorPos" (ByRef lpPoint As POINTAPI) As Integer
      Declare Function SetCursorPos Lib "user32" Alias "SetCursorPos" (ByVal X As Integer, ByVal Y As Integer) As Integer
      Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal dwData As Integer, ByVal dwExtraInfo As Integer)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-12
        • 2011-02-05
        • 2017-10-22
        • 1970-01-01
        • 2011-06-12
        • 1970-01-01
        • 2011-10-06
        相关资源
        最近更新 更多