Отправка щелчка мыши в определенную позицию без перемещения мыши - PullRequest
4 голосов
/ 17 ноября 2010

Я хочу отправить щелчок мыши в определенную позицию на экране, не затрагивая положение курсора мыши.

Я искал и пробовал все под солнцем с помощью 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);

Спасибозаранее за любую помощь!

Ответы [ 4 ]

1 голос
/ 17 ноября 2010

Вы не включили флаг MOUSEEVENTF_MOVE, поэтому курсор не будет двигаться.

Я бы порекомендовал сделать 3 разных звонка (переместить, вниз, вверх), делать все одновременно ненадежно. Но может сработать, поэкспериментируйте, если вы действительно хотите сократить это. Кстати, SendInput - это то, что SDK рекомендует вам использовать.

0 голосов
/ 03 мая 2016

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)
0 голосов
/ 02 декабря 2011

Вы можете попытаться захватить текущее местоположение мыши, переместить мышь туда, где вы хотите, чтобы она щелкнула, щелкните местоположение, а затем переместите мышь назад.Если это сделать достаточно быстро, похоже, что мышь не двигалась.

0 голосов
/ 17 ноября 2010

Возможно, вы отправляете щелчок мышью в неправильное место. mouse_event принимает значения X и Y в микши, как описано в документации здесь .

Попробуйте преобразовать ваше местоположение следующим образом:

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 );
}
...