Вопрос:
Можно ли отправить виртуальную мышь щелкнуть в определенном месте экрана , не влияя на «реальную» позицию курсора? , да, как это можно реализовать? временно перемещение мыши, а затем перемещение ее обратно не является вариантом, либо , потому что это мешает «реальной» мышью. Например, если я запускаю щелчок из кнопки в пользовательском интерфейсе, мышь уже за этой кнопкой, так что в итоге она снова называет функцию в цикле, потому что она не выполняет щелчок, где я установил ее на (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
Как правильно отправить мышь на экране, не перемещая курсор ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение