Эмуляция мыши: перемещение ярлыка на рабочем столе - C#
Формулировка задачи:
Доброго времени всем! Придумал себе задачу: на рабочем столе лежит ярлык. Необходимо его программно, по нажатию на кнопку, переместить в другое место с наперёд заданными координатами. Как я это понимаю: 1)наводим курсор на ярлык; 2) зажимаем ЛКМ; 3)перемещаем курсор на новую позицию; 4) отжимаем ЛКМ. Пишу в WinForms. Код прилагаю. Прошу совета: что в коде не так? Наперёд благодарен за любую подсказку!
using System;
using System.Drawing;
using System.Windows.Forms;
namespace MouseEmul
{
public partial class Form1 : Form
{
[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
public static extern void mouse_event(uint dwFlags,int dx,int dy,int dwData,int dwExtraInfo);
//Нормированные абсолютные координаты
private const int MOUSEEVENTF_ABSOLUTE = 0x8000;
//Нажатие на левую кнопку мыши
private const int MOUSEEVENTF_LEFTDOWN = 0x0002;
//Поднятие левой кнопки мыши
private const int MOUSEEVENTF_LEFTUP = 0x0004;
//перемещение указателя мыши
private const int MOUSEEVENTF_MOVE = 0x0001;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//Координаты ярлыка на экране:
int X = 30;
int Y = 30;
//Перемещение курсора на указанные координаты
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE,
System.Windows.Forms.SystemInformation.PrimaryMonitorSize.Width,
System.Windows.Forms.SystemInformation.PrimaryMonitorSize.Height, X, Y);
//Выполнение клика левой клавишей мыши
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0);
//Изменение положения курсора на новое
Cursor.Position = new Point(Cursor.Position.X + 500, Cursor.Position.Y + 500);
//Отжимаем левую клавишу мыши
mouse_event(MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP, X, Y, 0, 0);
}
}
}Решение задачи: «Эмуляция мыши: перемещение ярлыка на рабочем столе»
textual
Листинг программы
using System;
using System.Runtime.InteropServices;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.StartPosition=FormStartPosition.CenterScreen;
}
private async void button1_Click(object sender, EventArgs e)
{
int x = 20, y = 20;// top shortcut on desktop
Worker.SetCursorPos(0, 0);
Worker.mouse_event(0x1,x,y,0,0); //move
Worker.mouse_event(0x2, 0,0,0,0);//left down
Worker.mouse_event(0x1,100,100,0,0);//move, 100,100 is a new location
await Task.Delay(1000);
Worker.mouse_event(0x4,0,0,0,0);//left up
}
}
class Worker
{
[DllImport("user32.dll")]
public static extern void mouse_event(uint dwFlags, int dx, int dy, uint dwData, int dwExtraInfo);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SetCursorPos(int x, int y);
}
}