2011-06-20 36 views
5

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; 
} 

Respuesta

1

Puede enviar ventanas teclas de acceso directo

Win + = para iniciar lupa
Win + + para el zoom en
Win + - para alejar

Windows Input Simulator es una buena biblioteca para el envío de claves como el logotipo de Windows

+0

hecho. ¿Cómo hace uno eso? No veo una tecla SendWait para el botón de Win. – tsilb

+0

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

+0

No puedo entender por qué no puedo enviar winkey en SendKeys? –

Cuestiones relacionadas