Estoy construyendo un sistema de gestos para Kinect SDK en una aplicación C#/WPF. Quiero agregar un gesto para ampliar y cerrar la lupa. Preferiría usar el Ampliador de Windows incorporado o su lógica subyacente, pero cualquier forma de obtener un efecto similar (consciente de múltiples monitores) funcionaría.Invoke Windows Magnifier
¿Cómo puedo invocar programáticamente las funciones de zoom de la lupa de Windows?
Hasta ahora, lo único que he encontrado con alguna esperanza es comenzar el proceso y hacer clic en el botón a través de Win32; pero cuando lo hago, aparece una ventana vacía y en blanco cuando llamo al controlador de la ventana del Ampliador.
He remendado este código a través de una combinación de lo que sé de C#, un montón de llamadas a la API de Win32 que realmente no conozco tan bien, y un montón de Google.
private void ZoomIn()
{
// Make sure the Magnifier is running, and get its handle
if (Process.GetProcesses().Where(p => p.ProcessName.ToLower() == "magnify").Count() == 0) {
Process.Start("magnify.exe");
System.Threading.Thread.Sleep(500); }
IntPtr handle = Process.GetProcesses().Where(p => p.ProcessName.ToLower() == "magnify").First().Handle;
// Figure out what size ("mode") it's in
WINDOWPLACEMENT placement = new WINDOWPLACEMENT();
placement.length = Marshal.SizeOf(placement);
GetWindowPlacement(handle, ref placement);
// Move the Magnifier to a predetermined location so we know where to click
MoveWindow(handle, new Point(0, 0));
// If Magnifier is in small mode, click it to put it in big mode.
if (placement.rcNormalPosition.Size.Width == 132) {
SetCursorPos(15, 15);
mouse_event((int)HardwareEvents.MouseLeftDown, 15, 15, 0, 0);
mouse_event((int)HardwareEvents.MouseLeftUp, 15, 15, 0, 0); }
// Click the zoom in button. Yeah, I know, hackish. Isn't Win32 awesome?
SetCursorPos(25, 25);
mouse_event((int)HardwareEvents.MouseLeftDown, 25, 25, 0, 0);
mouse_event((int)HardwareEvents.MouseLeftUp, 25, 25, 0, 0);
}
private void MoveWindow(IntPtr handle, Point point)
{
// TODO: Figure out how to look up the target window's size
SetWindowPos(handle, new IntPtr((int)SpecialWindowHandles.HWND_TOP), (int)point.X, (int)point.Y, 500, 500, SetWindowPosFlags.ShowWindow);
}
private struct WINDOWPLACEMENT {
public int length;
public int flags;
public int showCmd;
public System.Drawing.Point ptMinPosition;
public System.Drawing.Point ptMaxPosition;
public System.Drawing.Rectangle rcNormalPosition; }
[DllImport("user32.dll")]
static extern bool GetWindowPlacement(IntPtr hWnd, ref WINDOWPLACEMENT lpwndl);
[DllImport("user32.dll")]
static extern bool SetCursorPos(int X, int Y);
public static class HardwareEvents
{
public static int MouseMove = 0x0001;
public static int MouseLeftDown = 0x0002, MouseLeftUp = 0x0004;
public static int MouseRightDown = 0x0008, MouseRightUp = 0x0010; // best guess on the 0010
public static int MiddleMouseDown = 0x20, MiddleMouseUp = 0x40;
public static int MouseWheel = 0x800;
}
hecho. ¿Cómo hace uno eso? No veo una tecla SendWait para el botón de Win. – tsilb
Tuve que enviar códigos de escaneo en lugar de SendWait/SendKeys, porque aparentemente tienen códigos de escaneo pero no de teclas. Es extraño que solo sea ese meta y no ctrl/alt/shift. Esos tienen códigos de pulsación de teclas. – tsilb
No puedo entender por qué no puedo enviar winkey en SendKeys? –