如何在 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++ 将麦克风静音? 的相关文章

  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • 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