Как правильно отправить мышь на экране, не перемещая курсорC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как правильно отправить мышь на экране, не перемещая курсор

Сообщение Anonymous »

Вопрос:
Можно ли отправить виртуальную мышь щелкнуть в определенном месте экрана , не влияя на «реальную» позицию курсора? , да, как это можно реализовать? временно перемещение мыши, а затем перемещение ее обратно не является вариантом, либо , потому что это мешает «реальной» мышью. Например, если я запускаю щелчок из кнопки в пользовательском интерфейсе, мышь уже за этой кнопкой, так что в итоге она снова называет функцию в цикле, потому что она не выполняет щелчок, где я установил ее на (x25, y20) относительно монитора. Но это побеждает цель, поскольку я хочу избежать перемещения «реального» курсора. Я открыт для решений в C# (с p/invoke) или c.StartCommand = new RelayCommand(o =>
{
VirtualMouse.SendVirtualClick(25, 20);
},
o => true);

virtualmouse.cs
public static class VirtualMouse
{
[StructLayout(LayoutKind.Sequential)]
private struct INPUT
{
public uint type;
public MOUSEINPUT mi;
}

[StructLayout(LayoutKind.Sequential)]
private struct MOUSEINPUT
{
public int dx;
public int dy;
public uint mouseData;
public uint dwFlags;
public uint time;
public IntPtr dwExtraInfo;
}

[DllImport("user32.dll", SetLastError = true)]
private static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize);

[DllImport("user32.dll")]
private static extern int GetSystemMetrics(int nIndex);

private const uint MOUSEEVENTF_LEFTDOWN = 0x0002;
private const uint MOUSEEVENTF_LEFTUP = 0x0004;
private const uint MOUSEEVENTF_ABSOLUTE = 0x8000;
private const uint MOUSEEVENTF_MOVE = 0x0001;
private const uint INPUT_MOUSE = 0;

public static void SendVirtualClick(int x, int y)
{
// Get screen dimensions
int screenWidth = GetSystemMetrics(0);
int screenHeight = GetSystemMetrics(1);

// Convert to absolute coordinates (0-65535)
int absoluteX = (x * 65535) / screenWidth;
int absoluteY = (y * 65535) / screenHeight;

// Create input sequence
INPUT[] inputs = new INPUT[3];

// 1. First send a zero-movement to sync cursor state (invisible to user)
inputs[0] = new INPUT
{
type = INPUT_MOUSE,
mi = new MOUSEINPUT
{
dx = 0,
dy = 0,
dwFlags = MOUSEEVENTF_MOVE,
time = 0
}
};

// 2. Mouse down at target position
inputs[1] = new INPUT
{
type = INPUT_MOUSE,
mi = new MOUSEINPUT
{
dx = absoluteX,
dy = absoluteY,
dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN,
time = 0
}
};

// 3. Mouse up at same position
inputs[2] = new INPUT
{
type = INPUT_MOUSE,
mi = new MOUSEINPUT
{
dx = absoluteX,
dy = absoluteY,
dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP,
time = 0
}
};

// Send all inputs at once
SendInput(3, inputs, Marshal.SizeOf(typeof(INPUT)));
}
}


Подробнее здесь: https://stackoverflow.com/questions/796 ... the-cursor
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»