2012-07-09 9 views
7

Estoy usando WPF e importé la referencia System.Windows.Form. Aquí está mi código:SendKey.Send() No funciona

Process[] process = Process.GetProcessesByName("wmplayer"); 
SetForegroundWindow(process[0].MainWindowHandle); 
Thread.Sleep(200); 
System.Windows.Forms.SendKeys.Send("^p"); 

El Windows Media Player do Focus, pero no se recibe ninguna tecla. ¿Por qué?

+1

Aparece System.Windows.Forms.SendKeys.Send envía pulsaciones de teclas a la aplicación "activa" (http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.aspx). No estoy del todo seguro de lo que eso significa, pero podría estar limitado al proceso en el que se está ejecutando. Trate de usar la API de Win32, eche un vistazo a esta pregunta http://stackoverflow.com/questions/3047375/simulating- key-press-c-sharp – James

+3

@James definitivamente no se limita al proceso en el que se está ejecutando. – Tim

Respuesta

7

Puede usar API de Windows en lugar de SendKeys:

[DllImport("user32.dll", SetLastError = true)] 
static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, UIntPtr dwExtraInfo); 
public static void PressKey(Keys key, bool up) { 
    const int KEYEVENTF_EXTENDEDKEY = 0x1; 
    const int KEYEVENTF_KEYUP = 0x2; 
    if (up) { 
     keybd_event((byte) key, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, (UIntPtr) 0); 
    } 
    else { 
     keybd_event((byte) key, 0x45, KEYEVENTF_EXTENDEDKEY, (UIntPtr) 0); 
    } 
} 

void TestProc() { 
    PressKey(Keys.ControlKey, false); 
    PressKey(Keys.P, false); 
    PressKey(Keys.P, true); 
    PressKey(Keys.ControlKey, true); 
} 
+0

Según los documentos (http://msdn.microsoft.com/en-us/library/windows/desktop/ms646304 (v = vs.85) .aspx), keybd_event ha sido reemplazado y SendInput debería usarse en su lugar. – Tim

+0

Es cierto, pero este código funciona bien en todas las versiones de Windows desde XP a Windows 8 (tal vez el otro también, pero no lo he probado). Y en mi opinión, usar SendInput no es tan fácil como keybd_event. –

+0

Exactamente lo que necesitaba. Gracias ahora puedo acceder al botón MediaPlayPause y así sucesivamente ... –

4

En las aplicaciones de WPF que tienen que utilizar SendKeys.SendWait() (English Documentation) en su lugar.

Simplemente doblemente marcado, mientras que Send() funciona para la aplicación WinForms, WPF arroja una excepción InvalidOperationException, aunque ambos tienen como objetivo .net 4.0.

Consulte el enlace de arriba para más información.