2010-01-16 25 views
4

Je voulais savoir, quel serait le codage si je voulais activer/désactiver le son de mon microphone. Je fais un programme qui peut fonctionner en arrière-plan et ramasser un événement de pression de touche et basculer mute/unmute du micro. Toute aide avec un tel codage serait très utile. Je suis assez nouveau à C#, et c'est juste un programme très simple que je voulais faire. C'est tout ce qu'il fait, c'est qu'il va écouter pour appuyer sur la barre d'espace, même lorsque le programme est en arrière-plan, puis quand la barre d'espace est pressée, il va couper/activer le micro.Comment couper le microphone C#

Nous vous remercions de toute l'aide!

+0

P.S. Il peut également couper un seul périphérique, parce que je suis en train d'écouter le microphone ou de le lire via les haut-parleurs de mon ordinateur, Windows Vista et 7 afficheront les programmes individuels à l'aide du Volume Mixer, donc s'il y a un moyen de programmer activer/désactiver un seul programme, cette méthode fonctionnera aussi. – Sean

Répondre

0

vous pouvez utiliser pour accéder mics MCI (Media Control Interface) et changer leur système de volume sage. Vérifiez le code ci-dessous, il devrait être réglé sur 0 pour tous les microphones du système. Le code est en c; vérifier pinvoke pour plus de détails sur la façon de traduire ce code C#

#include "mmsystem.h" 
... 
void MuteAllMics() 
{ 
    HMIXER hmx; 
    mixerOpen(&hmx, 0, 0, 0, 0); 

    // Get the line info for the wave in destination line 
    MIXERLINE mxl; 
    mxl.cbStruct = sizeof(mxl); 
    mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN; 
    mixerGetLineInfo((HMIXEROBJ)hmx, &mxl, MIXER_GETLINEINFOF_COMPONENTTYPE); 

    // find the microphone source line connected to this wave in destination 
    DWORD cConnections = mxl.cConnections; 
    for (DWORD j=0; j<cConnections; j++) 
    { 
     mxl.dwSource = j; 
     mixerGetLineInfo((HMIXEROBJ)hmx, &mxl, MIXER_GETLINEINFOF_SOURCE); 

     if (MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE == mxl.dwComponentType) 
     { 
      // Find a volume control, if any, of the microphone line 
      LPMIXERCONTROL pmxctrl = (LPMIXERCONTROL)malloc(sizeof MIXERCONTROL); 
      MIXERLINECONTROLS mxlctrl = 
      { 
       sizeof mxlctrl, 
       mxl.dwLineID, 
       MIXERCONTROL_CONTROLTYPE_VOLUME, 
       1, 
       sizeof MIXERCONTROL, 
       pmxctrl 
      }; 
      if (!mixerGetLineControls((HMIXEROBJ) hmx, &mxlctrl, MIXER_GETLINECONTROLSF_ONEBYTYPE)) 
      { 
       DWORD cChannels = mxl.cChannels; 
       if (MIXERCONTROL_CONTROLF_UNIFORM & pmxctrl->fdwControl) 
        cChannels = 1; 

       LPMIXERCONTROLDETAILS_UNSIGNED pUnsigned = (LPMIXERCONTROLDETAILS_UNSIGNED) 
       malloc(cChannels * sizeof MIXERCONTROLDETAILS_UNSIGNED); 
       MIXERCONTROLDETAILS mxcd = 
       { 
        sizeof(mxcd), 
        pmxctrl->dwControlID, 
        cChannels, 
        (HWND)0, 
        sizeof MIXERCONTROLDETAILS_UNSIGNED, 
        (LPVOID) pUnsigned 
       }; 
       mixerGetControlDetails((HMIXEROBJ)hmx, &mxcd, MIXER_SETCONTROLDETAILSF_VALUE); 

       // Set the volume to the middle (for both channels as needed) 
       //pUnsigned[0].dwValue = pUnsigned[cChannels - 1].dwValue = (pmxctrl->Bounds.dwMinimum+pmxctrl->Bounds.dwMaximum)/2; 
       // Mute 
       pUnsigned[0].dwValue = pUnsigned[cChannels - 1].dwValue = 0; 
       mixerSetControlDetails((HMIXEROBJ)hmx, &mxcd, MIXER_SETCONTROLDETAILSF_VALUE); 

       free(pmxctrl); 
       free(pUnsigned); 
      } 
      else 
      { 
       free(pmxctrl); 
      } 
     } 
    } 
    mixerClose(hmx); 
} 

here vous pouvez trouver plus de code à ce sujet

espérons que cette aide, ce qui

5

Pour Windows Vista et plus récent, vous ne pouvez plus utiliser l'interface de contrôle des médias, Microsoft a un nouveau Core Audio API que vous devez accéder à l'interface avec le matériel audio dans ces nouveaux systèmes d'exploitation.

Ray Molenkamp a écrit un wrapper managé agréable pour l'interface avec l'API Core Audio ici: Vista Core Audio API Master Volume Control

Depuis que je devais être en mesure de couper le microphone de XP, Vista et Windows 7, j'ai écrit un peu Windows Microphone Mute Library qui utilise Bibliothèque de Ray sur les systèmes d'exploitation les plus récents et des parties de Gustavo Franco's MixerNative library pour Windows XP et plus anciens.

+1

Merci pour votre bibliothèque, exactement ce dont j'avais besoin. :) –

+0

Le lien est maintenant cassé – ickydime

+0

Vous pouvez utiliser ce https://www.nuget.org/packages/AudioSwitcher.AudioApi.CoreAudio/4.0.0-alpha5 –

0

J'ai plusieurs microphones dans win7 et la classe WindowsMicrophoneMuteLibrary.CoreAudioMicMute est incorrecte dans ce cas. Donc je change le code et fonctionne bien car maintenant sa coupe siffle tous les micros et pas seulement dans le dernier reconnu par win7.

Je joins la nouvelle classe à mettre en place.

http://www.developpez.net/forums/d1145354/dotnet/langages/csharp/couper-micro-sous-win7/

+1

comment cela aide-t-il à couper un microphone? – Michael