Эмуляция клавиш манипулятора
Для удобства управления была разработана модель нажатия клавиши «мыши» с помощью жеста, таким образом, возможно, выбирать и переносить ярлыки, нажимать кнопки и использовать все функции операционной системы. Для нажатия на кнопку необходимо остановить указатель и в течение двух секунд (при стандартный настройках программы), удерживать указатель на месте. Данное действие откроет меню, где будет предложены варианты нажатий (одиночное нажатие, двойное, scroll). При данном подходе имеется возможность использовать все возможности среды операционной системы.
Программный код эмуляции нажатия кнопок манипулятора:
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: thrownewWin32Exception("Невозможно преобразовать значение!");
}
}
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);
}
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);
}
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);
}
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
{
public static int GET_X_LPARAM(int x)
{
return x & 0xffff;
}
///
/// C++ макрос для GET_Y_LPARAM.
///
public static int GET_Y_LPARAM(int x)
{
return (x >> 16) & 0xffff;
}
public static int MAKELONG(int x, int y)
{
return (x & 0xffff) | ((y & 0xffff)