4

我想知道,如果我想切换麦克风的静音/取消静音,编码会是什么。我正在制作一个可以在后台运行并拾取按键事件并切换麦克风静音/取消静音的程序。对任何编码的任何帮助都会非常有帮助。我对 C# 很陌生,这只是我想做的一个非常简单的程序。这就是它所做的一切,它是否会监听空格键的按键,即使程序在后台,然后当按下空格键时,它会将麦克风静音/取消静音。

感谢您的任何帮助!

4

4 回答 4

5

对于 Windows Vista 和更新版本,您不能再使用媒体控制接口,Microsoft 有一个新的Core Audio API,您必须访问它才能与这些较新操作系统中的音频硬件接口。

Ray Molenkamp 在这里编写了一个很好的托管包装器,用于与 Core Audio API 交互: Vista Core Audio API Master Volume Control

由于我需要能够在 XP、Vista 和 Windows 7 中使麦克风静音,因此我编写了一个小的Windows 麦克风静音库,它在较新的操作系统上使用 Ray 的库,以及用于 Windows XP 和更早版本的Gustavo Franco 的 MixerNative 库的一部分。

于 2010-11-12T20:59:06.407 回答
0

我在 win7 中有几个麦克风,在这种情况下,WindowsMicrophoneMuteLibrary.CoreAudioMicMute 类不正确。

所以我更改了代码并且效果很好,因为现在他的杯子里所有的麦克风都在吹口哨,而不仅仅是在最后一次被win7识别。

我正在附加新课程以到位。

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

于 2011-10-30T12:11:51.240 回答
0

您可以下载整个应用程序的源代码,该应用程序具有麦克风静音、选择它作为录音设备等。

http://www.codeguru.com/csharp/csharp/cs_graphics/sound/article.php/c10931/

于 2010-01-16T23:20:35.580 回答
0

您可以使用 MCI(媒体控制界面)访问麦克风并明智地更改它们的音量系统。检查下面的代码,它应该将所有系统麦克风的音量设置为 0。代码在c中;检查pinvoke以获取有关如何将此代码转换为 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); 
}

在这里您可以找到有关此主题的更多代码

希望这会有所帮助,问候

于 2010-01-16T23:47:31.420 回答