2009-04-20 15 views
6

He escrito un pequeño programa que muestra sonidos e imágenes en la pantalla al presionar cualquier botón. Siempre empiezo cuando uno de mis pequeños niños se arrastra sobre mi regazo y comienza a golpear las teclas, por supuesto, al azar.Capturando la tecla de Windows en C# (wpf)

Funciona bien excepto por 2 teclas, una de ellas es el interruptor de ENCENDIDO/APAGADO, y la otra es la tecla de Windows. (Creo que el equivalente CTRL-ESC) puedo interceptarlo cuando se presiona, pero solo después de que se muestre el menú de inicio.

El evento que utilizo es el UIElement.KeyDown y todo lo que podía ocurrió hasta ahora es: (el correo siendo KeyEventArgs)

  if (e.Key == Key.LWin) e.Handled = true; 

pero que la ventana de inicio ya está mostrando me temo.

Ya tengo 1 respuesta, pero me gustaría saber si hay algún wpf-support?

¿Sospecho que no es posible programar el interruptor principal de encendido/apagado? De lo contrario, cualquier ayuda allí sería bienvenida también.

Respuesta

17

Necesitará un keyboard hook. Desafortunadamente, esto tiene que hacerse con P/Invoke; no se puede hacer con código administrado.

Echa un vistazo Baby Smash! por Scott Hanselman. Está alojado en Plex código en http://www.codeplex.com/babysmash Github en https://github.com/shanselman/babysmash

alternativa, echa un vistazo a ShapeShow en CodeProject, que es similar.

+0

Esa es definitivamente una respuesta, tx. ¿Pero requiere interoperabilidad, no hay compatibilidad nativa con wpf de la que esté al tanto? – Peter

+0

Sí. Necesita interoperabilidad. Se actualizó la respuesta de AB para explicar eso y se agregó un enlace a ShapeShow. –

+0

Ok, si están seguros, ¡gracias por responder! (Ya tengo instalado babysmash mientras tanto) – Peter

3

Ver http://msdn.microsoft.com/en-us/library/system.windows.input.key(v=VS.90).aspx

En la parte inferior verá un ejemplo sencillo, creo que lo que estás buscando es algo a lo largo de estas líneas:

ventanas que dejan clave: System.Windows.Input.Key .LWin

derecho tecla windows: System.Windows.Input.Key.RWin

ejemplo:

private void OnKeyDownHandler(object sender, KeyEventArgs e) 
{ 
    if (e.Key == Key.LWin) { 
     textBlock1.Text = "You Entered: " + textBox1.Text; 
    } 
} 
Cuestiones relacionadas