如何在 Windows 7 中使用 C/C++ 将麦克风静音?

2023-11-29

我使用 WinAPI 编写了一个将麦克风静音的程序,它似乎在 Windows XP 中完美运行,但在 Windows 7 中不起作用。是否可以在 Windows 7 中使用 WinAPI 控制麦克风音量或静音?

void setVolume(DWORD volume) {
HMIXER mixer;

if (mixerOpen(&mixer, 0, 0, 0, 0) != MMSYSERR_NOERROR) {
    MessageBoxW(NULL, L"Error: mixerOpen()", NULL, MB_ICONHAND);
    return;
}

// Get the line info
MIXERCAPS mixcaps;
MIXERLINE mixerLine;
mixerGetDevCaps(0, &mixcaps, sizeof(MIXERCAPS));
mixerLine.cbStruct = sizeof(MIXERLINE);
mixerLine.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_WAVEIN;
mixerLine.dwSource = 0;
mixerLine.dwDestination = 0;

if (mixerGetLineInfo(reinterpret_cast<HMIXEROBJ>(mixer), &mixerLine, MIXER_GETLINEINFOF_SOURCE)
    != MMSYSERR_NOERROR) {
        MessageBoxW(NULL, L"Error: mixerGetLineInfo()", NULL, MB_ICONHAND);
        return;
}

// Get control for mixerline
MIXERCONTROL mixerCtrl;
MIXERLINECONTROLS mixerLineCtrl;

mixerLineCtrl.cbStruct = sizeof(MIXERLINECONTROLS);
mixerLineCtrl.dwLineID = mixerLine.dwLineID;
mixerLineCtrl.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
mixerLineCtrl.cControls = 1;
mixerLineCtrl.pamxctrl = &mixerCtrl;
mixerLineCtrl.cbmxctrl = sizeof(MIXERCONTROL);
mixerLineCtrl.cControls = 5;

if (mixerGetLineControls(reinterpret_cast<HMIXEROBJ>(mixer), &mixerLineCtrl, MIXER_GETLINECONTROLSF_ONEBYTYPE)
    != MMSYSERR_NOERROR) {
        MessageBoxW(NULL, L"Error: mixerGetLineControls()", NULL, MB_ICONHAND);
        return;
}

// Volume..
MIXERCONTROLDETAILS mixerCtrlDetails;
MIXERCONTROLDETAILS_UNSIGNED mixerCtrlDetailsUnsigned;

mixerCtrlDetailsUnsigned.dwValue = volume;
mixerCtrlDetails.dwControlID = mixerCtrl.dwControlID;
mixerCtrlDetails.cbStruct = sizeof(MIXERCONTROLDETAILS);
mixerCtrlDetails.cMultipleItems = 0;
mixerCtrlDetails.paDetails = &mixerCtrlDetailsUnsigned;
mixerCtrlDetails.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mixerCtrlDetails.cChannels = 1;

if (mixerSetControlDetails(reinterpret_cast<HMIXEROBJ>(mixer), &mixerCtrlDetails, MIXER_OBJECTF_HMIXER | MIXER_GETCONTROLDETAILSF_VALUE)
    != MMSYSERR_NOERROR) {
        MessageBoxW(NULL, L"Error: mixerSetControlDetails()", NULL, MB_ICONHAND);
        return;
}

mixerClose(mixer);
}

您需要使用Windows Vista 引入的新音频 API.

这是一个例子.

*EDIT:Visual Studio 2015(C++):

Usange:

// To 100%
ConsoleApplication3.exe -f 1

// To  0%
ConsoleApplication3.exe -f 0

// To 50%
ConsoleApplication3.exe -f 0.50

Code:

enter image description here

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <mmdeviceapi.h>
#include <endpointvolume.h>

void Usage()
{
    printf("Usage: \n");
    printf(" SetVolume [Reports the current volume]\n");
    printf(" SetVolume -d <new volume in decibels> [Sets the current default render device volume to the new volume]\n");
    printf(" SetVolume -f <new volume as an amplitude scalar> [Sets the current default render device volume to the new volume]\n");

}
int _tmain(int argc, _TCHAR* argv[])
{
    HRESULT hr;
    bool decibels = false;
    bool scalar = false;
    double newVolume;
    if (argc != 3 && argc != 1)
    {
        Usage();
        return -1;
    }
    if (argc == 3)
    {
        if (argv[1][0] == '-')
        {
            if (argv[1][1] == 'f')
            {
                scalar = true;
            }
            else if (argv[1][1] == 'd')
            {
                decibels = true;
            }
        }
        else
        {
            Usage();
            return -1;
        }

        newVolume = _tstof(argv[2]);
    }

    // -------------------------
    CoInitialize(NULL);
    IMMDeviceEnumerator *deviceEnumerator = NULL;
    hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMMDeviceEnumerator), (LPVOID *)&deviceEnumerator);
    IMMDevice *defaultDevice = NULL;

    hr = deviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &defaultDevice);
    deviceEnumerator->Release();
    deviceEnumerator = NULL;

    IAudioEndpointVolume *endpointVolume = NULL;
    hr = defaultDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_INPROC_SERVER, NULL, (LPVOID *)&endpointVolume);
    defaultDevice->Release();
    defaultDevice = NULL;

    // -------------------------
    float currentVolume = 0;
    endpointVolume->GetMasterVolumeLevel(&currentVolume);
    printf("Current volume in dB is: %f\n", currentVolume);

    hr = endpointVolume->GetMasterVolumeLevelScalar(&currentVolume);
    printf("Current volume as a scalar is: %f\n", currentVolume);
    if (decibels)
    {
        hr = endpointVolume->SetMasterVolumeLevel((float)newVolume, NULL);
    }
    else if (scalar)
    {
        hr = endpointVolume->SetMasterVolumeLevelScalar((float)newVolume, NULL);
    }
    endpointVolume->Release();

    CoUninitialize();
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Windows 7 中使用 C/C++ 将麦克风静音? 的相关文章

随机推荐

  • prometheus relabel_config 删除操作不起作用

    我一直在尝试删除未使用的指标 在抓取之前 以减轻 Prometheus 集群上的负载relabel configs job name nginx ingress controller metrics kubernetes sd config
  • 表不是由 Hibernate 创建的

    我注释了一堆 POJO 以便 JPA 可以使用它们在 Hibernate 中创建表 看起来除了一个名为 Revision 的非常核心的表之外 所有表都已创建 Revision 类有一个 Entity name RevisionT 注解 因此
  • python3 cvxopt.matrix 和 numpy.array 之间的转换

    蟒蛇 蟒蛇3 2 CVXOPT 1 1 5 numpy 1 6 1 I read http abel ee ucla edu cvxopt examples tutorial numpy html import cvxopt import
  • 计算两个日期之间的工作日数

    我正在尝试获取 plpgsql 中两个日期之间的工作日数 以下是我的代码 CREATE FUNCTION weekdays DATE DATE RETURNS INTEGER AS DECLARE d date 1 weekdays int
  • Google GeoCoding API - 返回 ZERO_RESULTS 但位置显示在 Google 地图上

    我正在使用 Google GeoCode API 从地址搜索位置并获取该位置的 LAT LON 信息 从API我总是得到ZERO RESULTS就好像我从谷歌地图中搜索地址一样 它会显示位置 我搜索的地址是 5989 Route 6N Ed
  • 如何证明 Coq 中的两个 Fibonacci 实现相等?

    我有两个斐波那契实现 如下所示 我想证明它们在功能上是等效的 我已经证明了自然数的性质 但是这个练习需要另一种我无法弄清楚的方法 我使用的教科书介绍了 Coq 的以下语法 因此应该可以使用这种表示法来证明相等性
  • Grand Central Dispatch 中线程限制的解决方法?

    With 大中央快讯 可以轻松地在非主线程上执行耗时的任务 避免阻塞主线程并保持 UI 响应 只需使用dispatch async并在全局并发队列上执行任务 dispatch async dispatch get global queue
  • VBA计算图表对象中的系列数

    我知道这看起来很简单 但似乎对我不起作用 我在 Sheet1 上有一个图表 这是该表上唯一的图表 我想获取图表中的系列数 所以我用 Debug Print ThisWorkbook Sheets Sheet1 ChartObjects 1
  • 使用非 root 用户时出现 ffmpeg 错误

    我已经安装了 ffmpeg 如果您是 root 或使用 sudo 它可以完美工作 但在尝试作为非 root 用户使用它时会出错 我在测试 VPS 上执行了相同的安装 安装没有问题 因此它似乎与此 cPanel 服务器隔离 我无法确定原因 非
  • 如何为Python编译C扩展,其中C函数使用LAPACK库?

    我为 Python 编写了一个 C 扩展 并且该模块已成功编译在 so 文件中 但是 当我尝试在 Python 端使用包装的 C 函数 Python 中调用包装的 C 函数的测试代码 时 我得到以下信息ImportError ImportE
  • 如何在android回收站视图中放置Admob本机高级广告?

    我想将 admob 原生高级广告放置在 Android 应用程序中回收器视图的每 3 个位置 我想要 Admob 提供的模板 https github com googleads googleads mobile android nativ
  • 透明图像中的javafx鼠标事件

    如果您单击或拖动透明像素 JavaFx ImageView 不会触发鼠标事件 例如按下或拖动 是否有办法解决此问题并检测来自透明区域的鼠标事件 I have this image that i added into this very si
  • 我应该如何从 Selenium Java WebDriver 与 Flash 进行最佳交互

    我知道有很多类似的问题 例如 使用 WebDriver 交互 Flash 元素 过去曾被问到 但目前尚不清楚如何最好地与与 Selenium 的 Java WebDriver 相关的页面上的 Flash 元素进行交互 默认情况下 我知道它不
  • Java MySQL 准备语句批处理

    我正在尝试使用准备好的语句批处理 但遇到问题 以下代码不会给我错误 但它仅在表中插入地图的最后一个键 我不知道为什么 这肯定是一个非常愚蠢的错误 但这是我第一次使用 addBatch 方法 Class forName com mysql j
  • 使用 ScreenCapture.CaptureScreenshot 捕获并保存屏幕截图

    我一直在尝试截取屏幕截图 然后立即使用它来显示某种预览 有时它有效 有时则无效 我目前不在工作 而且我没有统一这台计算机 所以我将尝试即时重新创建它 这里和那里可能存在一些语法错误 public GameObject screenshotP
  • 使用coord_equal()时,使用cowplot::plot_grid()垂直对齐不同高度的图

    我正在尝试使用组合两个 ggplot 对象cowplot plot grid 并垂直对齐它们 这通常非常简单 使用align v dat1 lt data frame x rep 1 10 2 y 1 20 dat2 lt data fra
  • Java - 赋值的左侧必须是变量

    我正在尝试制作一个小程序来定位不同的城市 作为我的第一个 Java 项目 我想从 城市 类访问 GPS 类的变量 但我不断收到此错误 赋值的左侧必须是变量 任何人都可以向我解释我在这里做错了什么以及如何避免将来出现此类错误 public c
  • 在没有软件包的情况下在 python 中实现 Haar 小波

    我正在尝试编写一个代码来实现离散小波变换 haar 小波 dwt 而不使用 python 中的包 到目前为止 我找到了一个链接 他们实现了类似的功能 该链接这个小波变换实现正确吗 运行时没有报错 但最终结果不正确 我运行的代码是 def d
  • 根据所选的货币代码设置货币格式,无论设备的区域设置如何 (Swift)

    我正在尝试根据用户选择的货币来格式化货币 如果未选择货币 则使用设备的当前区域设置进行格式化 但是 我遇到了问题 我正在使用数字格式化程序将双精度格式格式化为货币字符串 let formatter NumberFormatter forma
  • 如何在 Windows 7 中使用 C/C++ 将麦克风静音?

    我使用 WinAPI 编写了一个将麦克风静音的程序 它似乎在 Windows XP 中完美运行 但在 Windows 7 中不起作用 是否可以在 Windows 7 中使用 WinAPI 控制麦克风音量或静音 void setVolume