Направление событий мыши [DllImport ("user32.dll")] щелчок, двойной щелчок - PullRequest
10 голосов
/ 05 января 2012

я пробовал [DllImport ( "User32.dll")] static extern bool SetCursorPos (int X, int Y);

, и он работает довольно хорошо, чтобы переместить курсор в нужную точку. Я никогда не пробовал такого рода импорт DLL, но он работает :). Однако я хочу больше, что еще я могу извлечь? В основном я хочу сделать двойной щелчок, щелкнуть или использовать параметры колеса без ввода мышью, просто код, как мне это сделать? и как я могу проверить, что еще входит в user32dll?

Thanx

Ответы [ 3 ]

12 голосов
/ 05 января 2012
[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

Используйте метод ниже, чтобы сделать Mouse Operation

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 (щелчок мыши) и удерживайте ее нажатой при изменении положения мыши, а затем отправьте MouseUp (отпускание клика) примерно так.

sendMouseDown();
Cursor.Position = new Point(30,30);
sendMouseUp();
5 голосов
/ 13 сентября 2012

Использование длинного типа вызывает ошибку «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);
}

source: http://www.pinvoke.net/default.aspx/user32.mouse_event

3 голосов
/ 05 января 2012

Посмотрите на pinvoke.net список доступных API. Примеры кода и операторы импорта включены. Вы также можете расширить выбор слева, чтобы увидеть доступные API для каждой DLL.

...