2011-01-23 13 views
5

Tengo el siguiente código para simular la pulsación de tecla volumemute:C# Simular VolumeMute pulse

[DllImport("coredll.dll", SetLastError = true)] 
    static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo); 

    byte VK_VOLUME_MUTE = 0xAD; 
    const int KEYEVENTF_KEYUP = 0x2; 
    const int KEYEVENTF_KEYDOWN = 0x0; 
    private void button1_Click(object sender, EventArgs e) 
    { 
      keybd_event(VK_VOLUME_MUTE, 0, KEYEVENTF_KEYDOWN, 0); 
      keybd_event(VK_VOLUME_MUTE, 0, KEYEVENTF_KEYUP, 0); 
    } 

Este código no funciona. Sé que hay otra forma de silenciar/activar el sonido mediante SendMessageW, pero no quiero usar SendMessageW porque utilizo KeyState para detectar si necesito silenciar el sonido o dejar de silenciarlo (si el usuario quiere desactivar el sonido y ya no lo está) entonces no necesito alternar - por eso tengo que simular la pulsación de tecla de VolumeMute)

Gracias.

+0

Cuando dices que no funciona, ¿obtienes una excepción de tu bondad p-invoke? – dexter

+0

Ningún error. simplemente no silencia el sonido ... – Ron

+0

¿Es esta ventana móvil? – fardjad

Respuesta

7

La primera razón por la que no funciona es porque usa la DLL incorrecta, coredll.dll es Windows Mobile. En la versión de escritorio de Windows, key32_event es exportado por user32.dll. La segunda razón por la que no funciona es porque enviar la tecla no es lo suficientemente bueno. No estoy seguro de por qué, esto parece ser interceptado antes del controlador de entrada genérico.

Puede usar WM_APPCOMMAND, admite un rango de comandos y APPCOMMAND_VOLUME_MUTE es uno de ellos. Actúa como un botón para activar y desactivar el enmudecimiento. Hacer que su código como este:

private void button1_Click(object sender, EventArgs e) { 
     var msg = new Message(); 
     msg.HWnd = this.Handle; 
     msg.Msg = 0x319;    // WM_APPCOMMAND 
     msg.WParam = this.Handle; 
     msg.LParam = (IntPtr)0x80000; // APPCOMMAND_VOLUME_MUTE 
     this.DefWndProc(ref msg); 
    } 

Este código tiene que estar dentro de un método de instancia del formulario, tenga en cuenta cómo se utiliza DefWndProc(). Si desea ubicarlo en otro lugar, debe recurrir a SendMessage(). El identificador de ventana real no importa, siempre que sea uno válido.

+1

la función que me dio NO simula la pulsación de tecla. Silencia el sonido pero no simula la pulsación de tecla. Sin embargo, su respuesta fue útil, cambio de coredll.dll a user32.dll y usé mi función, funcionó. gracias. – Ron

+0

Erm, silencia el sonido. ¿No es ese el punto? Es posible que desee considerar que en mi máquina, el envío de la tecla no funciona. Otros han observado ese problema también, hay varias preguntas al respecto en los foros de MSDN. Se sabe que el código que publiqué funciona bien. –

+1

Funciona, como mencioné antes. Pero mi punto es que: tengo 2 botones 1 para silenciar y 1 para activar el sonido - digamos que el estado actual del sonido es silenciado. Quiero reactivar el sonido, pero con tu solución, no importa qué botón presionaré, ambos hacen lo mismo ... así que básicamente lo que necesito es obtener el estado del volumen maestro ... – Ron