2011-01-23 11 views
5

ho ricevuto il seguente codice per simulare volumemute pressione del tasto:C# Simula VolumeMute premere

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

Questo codice non funziona. So che c'è un altro modo per silenziare/attivare il suono di SendMessageW, ma non voglio usare SendMessageW perché uso KeyState per rilevare quando ho bisogno di silenziare il suono o riattivare il suono (se l'utente vuole riattivare l'audio e il suo già riattivato quindi non ho bisogno di passare - ecco perché ho bisogno di simulare la pressione del tasto VolumeMute)

Grazie.

+0

Quando dici che non funziona, ottieni un'eccezione dalla tua invocazione di p? – dexter

+0

Nessun errore. non disattiva il suono .. – Ron

+0

È Windows Mobile? – fardjad

risposta

7

Il primo motivo per cui non funziona è perché si utilizza la DLL errata, coredll.dll è Windows Mobile. Nella versione desktop di Windows, keybd_event viene esportato da user32.dll. La seconda ragione per cui non funziona è che l'invio del tasto non è abbastanza buono. Non so bene perché, questo sembra essere intercettato prima del gestore di input generico.

È possibile utilizzare WM_APPCOMMAND, supporta un intervallo di comandi e APPCOMMAND_VOLUME_MUTE è uno di questi. Funziona come un interruttore, attivando e disattivando il muting. Fai il tuo look codice come questo:

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

Questo codice ha bisogno di essere all'interno di un metodo del modulo esempio, notare come si usa DefWndProc(). Se si desidera inserirlo altrove, è necessario eseguire il fallback su SendMessage(). L'attuale handle della finestra non ha importanza, purché sia ​​valido.

+1

la funzione che mi ha dato NON simula la pressione del tasto. Disattiva l'audio ma non simula la pressione del tasto. Tuttavia, la tua risposta è stata utile, cambio da coredll.dll a user32.dll e ho usato la mia funzione - ha funzionato. grazie. – Ron

+0

Erm, silenzia il suono. Non è questo il punto? Si potrebbe voler considerare che sulla mia macchina, l'invio della sequenza di tasti non funziona. Altri hanno osservato questo problema, ci sono diverse domande al riguardo nei forum MSDN. Il codice che ho postato è noto per funzionare bene. –

+1

Funziona, come ho detto prima. Ma il mio punto è: ho ottenuto 2 pulsanti 1 per il silenziamento e 1 per il silenziamento - diciamo che lo stato attuale del suono è silenziato. Voglio riattivare l'audio, ma con la tua soluzione, indipendentemente dal pulsante su cui farò clic, entrambi fanno lo stesso ... quindi, in sostanza, quello di cui ho bisogno è ottenere lo stato del volume master .... – Ron