Управление мышью - C#
Формулировка задачи:
Всем привет!
Кто-нибудь может подсказать, как сделать такую программу:
пользователь запускает приложение и курсор мыши начинает двигаться сам к кнопке "Пуск", затем выбирает команду "Выключить" и затем выключается комп, причём во время работы проги пользователь не может управлять мышью ?
Решение задачи: «Управление мышью»
textual
Листинг программы
public static class NativeMethods
{
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
static int GetWParamFromButton(MouseButton btn)
{
switch (btn)
{
case MouseButton.Left: return 0x0001;
case MouseButton.Middle: return 0x0010;
case MouseButton.Right: return 0x0002;
default: throw new Win32Exception("Невозможно преобразовать значение!");
}
}
/// <summary>
/// Эмуляция нажатия и отпускания кнопок мыши.
/// </summary>
/// <param name="hWnd">Дескриптор окна в которое будет послано сообщение.</param>
/// <param name="btn">Кнопка мыши.</param>
/// <param name="x">Координата X (относительно экрана).</param>
/// <param name="y">Координата Y (относительно экрана).</param>
public static void MouseClick(IntPtr hWnd, MouseButton btn, int x, int y)
{
int xyPoint = NativeMacros.MAKELONG(x, y);
int wParam = GetWParamFromButton(btn);
SendMessage(hWnd, (int)btn, wParam, xyPoint);
SendMessage(hWnd, (int)btn + 1, wParam, xyPoint);
}
/// <summary>
/// Эмуляция нажатия кнопок мыши.
/// </summary>
/// <param name="hWnd">Дескриптор окна в которое будет послано сообщение.</param>
/// <param name="btn">Кнопка мыши.</param>
/// <param name="x">Координата X (относительно экрана).</param>
/// <param name="y">Координата Y (относительно экрана).</param>
/// <returns>Возвращает результат работы функции SendMessage.</returns>
public static int MouseDown(IntPtr hWnd, MouseButton btn, int x, int y)
{
int xyPoint = NativeMacros.MAKELONG(x, y);
int wParam = GetWParamFromButton(btn);
return SendMessage(hWnd, (int)btn, wParam, xyPoint);
}
/// <summary>
/// Эмуляция отпускания кнопок мыши.
/// </summary>
/// <param name="hWnd">Дескриптор окна в которое будет послано сообщение.</param>
/// <param name="btn">Кнопка мыши.</param>
/// <param name="x">Координата X (относительно экрана).</param>
/// <param name="y">Координата Y (относительно экрана).</param>
/// <returns>Возвращает результат работы функции SendMessage.</returns>
public static int MouseUp(IntPtr hWnd, MouseButton btn, int x, int y)
{
int xyPoint = NativeMacros.MAKELONG(x, y);
int wParam = GetWParamFromButton(btn);
return SendMessage(hWnd, (int)btn + 1, wParam, xyPoint);
}
/// <summary>
/// Нажатие или отпускание определенной клавиши клавиатуры.
/// </summary>
/// <param name="hWnd">Дескриптор окна в которое будет послано сообщение.</param>
/// <param name="keys">Клавиша.</param>
/// <param name="up">FALSE если кнопка нажата, иначе TRUE.</param>
/// <returns>Возвращает результат работы функции SendMessage.</returns>
public static int KeyPress(IntPtr hWnd, Keys keys, bool up)
{
int WM_KEY = up ? 0x0101 /* WM_KEYUP */ : 0x0100 /* WM_KEYDOWN */;
return SendMessage(hWnd, WM_KEY, (int)keys, 0);
}
}
public struct NativeMacros
{
/// <summary>
/// C++ макрос для GET_X_LPARAM.
/// </summary>
public static int GET_X_LPARAM(int x)
{
return x & 0xffff;
}
/// <summary>
/// C++ макрос для GET_Y_LPARAM.
/// </summary>
public static int GET_Y_LPARAM(int x)
{
return (x >> 16) & 0xffff;
}
/// <summary>
/// C++ макрос для MAKELONG.
/// </summary>
public static int MAKELONG(int x, int y)
{
return (x & 0xffff) | ((y & 0xffff) << 16);
}
}
public enum MouseButton : int
{
Left = 0x201, // WM_LBUTTONDOWN
Right = 0x204, // WM_RBUTTONDOWN
Middle = 0x207 // WM_MBUTTONDOWN
}