c#,Powershell,mmsys.cpl,使用Win32 API展示音频设备属性对话框
常识基础众所周知mmsys.cpl使管理音频设备的控制面板小工具其能产生一个对话框属性表让我们查看和修改各设备的详细属性在音量合成器中单击音频输出设备的小图标也能实现这个效果分析查看进程后发现其原来调用了RunDll32.exeC:\Windows\system32\rundll32.exe shell32.dll,Control_RunDLL mmsys.cpl,,{0.0.0.00000000}.{46f5d09f-309e-4ec5-8919-4a881d3fc9e1},general那我们是不是可以试着调用一下呢本质上rundll调用了mmsys.cpl中的一个函数但是mmsys.cpl中只有CPlApplet一个函数怎么办观察{0.0.0.00000000}.{46f5d09f-309e-4ec5-8919-4a881d3fc9e1},general提供数据字符串由两组构成分别为前面的ID与后面的general组成这是一个很迷惑人的字符串实际上他们应作为一组字符串输入进阶那怎样获取ID呢根据DEEPSEEK帮忙我编制了一个小C#using System; using System.Collections.Generic; using System.Runtime.InteropServices; namespace AudioDeviceEnumerator { public static class Win32AudioAPI { // 常量定义 public const int DEVICE_STATE_ACTIVE 0x00000001; // 枚举定义 public enum EDataFlow { eRender 0, eCapture 1, eAll 2 } public enum ERole { eConsole 0, eMultimedia 1, eCommunications 2 } // COM 接口定义 [ComImport, Guid(A95664D2-9614-4F35-A746-DE8DB63617E6), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IMMDeviceEnumerator { int EnumAudioEndpoints(EDataFlow dataFlow, int stateMask, out IMMDeviceCollection devices); int GetDefaultAudioEndpoint(EDataFlow dataFlow, ERole role, out IMMDevice endpoint); int GetDevice(string id, out IMMDevice device); int RegisterEndpointNotificationCallback([MarshalAs(UnmanagedType.Interface)] object handler); int UnregisterEndpointNotificationCallback([MarshalAs(UnmanagedType.Interface)] object handler); } [ComImport, Guid(0BD7A1BE-7A1A-44DB-8397-CC5392387B5E), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IMMDeviceCollection { int GetCount(out int numDevices); int Item(int index, out IMMDevice device); } [ComImport, Guid(D666063F-1587-4E43-81F1-B948E807363F), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IMMDevice { int Activate([MarshalAs(UnmanagedType.LPStruct)] Guid iid, int clsCtx, IntPtr activationParams, [MarshalAs(UnmanagedType.IUnknown)] out object interfacePtr); int OpenPropertyStore(int access, out IPropertyStore properties); int GetId([MarshalAs(UnmanagedType.LPWStr)] out string id); int GetState(out int state); } [ComImport, Guid(886D8EEB-8CF2-4446-8D02-CDBA1DBDCF99), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IPropertyStore { int GetCount(out int count); int GetAt(int index, out PropertyKey key); int GetValue(ref PropertyKey key, out PropVariant value); int SetValue(ref PropertyKey key, ref PropVariant value); int Commit(); } [StructLayout(LayoutKind.Sequential)] public struct PropertyKey { public Guid fmtid; public int pid; } [StructLayout(LayoutKind.Sequential)] public struct CNM { public string Name; public string ID; } [StructLayout(LayoutKind.Sequential)] public struct PropVariant { public short vt; public short wReserved1; public short wReserved2; public short wReserved3; public IntPtr pointerValue; public int intValue; } // COM 类标识 [ComImport, Guid(BCDE0395-E52F-467C-8E3D-C4579291692E)] public class MMDeviceEnumerator { } // 辅助函数获取设备友好名称 public static string GetDeviceFriendlyName(IMMDevice device) { IPropertyStore propStore; device.OpenPropertyStore(0, out propStore); PropertyKey key new PropertyKey { fmtid new Guid(A45C254E-DF1C-4EFD-8020-67D146A850E0), pid 14 }; PropVariant value; propStore.GetValue(ref key, out value); return Marshal.PtrToStringUni(value.pointerValue); } // 枚举音频设备并返回设备信息 public static ListCNM EnumerateAudioDevices(EDataFlow dataFlow) { var enumerator (IMMDeviceEnumerator)new MMDeviceEnumerator(); IMMDeviceCollection devices; enumerator.EnumAudioEndpoints(dataFlow, DEVICE_STATE_ACTIVE, out devices); ListCNM L new ListCNM(); int count; devices.GetCount(out count); for (int i 0; i count; i) { IMMDevice device; devices.Item(i, out device); string id; device.GetId(out id); string name GetDeviceFriendlyName(device); CNM c new CNM(); c.Name name; c.ID id; L.Add(c); } return L; } } }在Powershell中我们只需要使用ADd-type加载一下然后调用[AudioDeviceEnumerator.Win32AudioAPI]::EnumerateAudioDevices([AudioDeviceEnumerator.Win32AudioAPIEDataFlow]::eAll)即可获取名称和ID熟悉WIN32编程的同学都知道CPlApplet函数的标准声明为CPlAppletIntPtr,int,ver,ver而要得到对话框我们就需要将第二个参数设置为10[DllImport(mmsys.cpl, SetLastError true, CharSet CharSet.Unicode)] public static extern int CPlApplet( IntPtr hwndCpl, int msg, string lParam1, string lParam2 );简单一调用CPlApplet(0,10,null,{0.0.0.00000000}.{46f5d09f-309e-4ec5-8919-4a881d3fc9e1},general)成功拓展然而{0.0.0.00000000}.{46f5d09f-309e-4ec5-8919-4a881d3fc9e1},general中前面ID已经明白后面的general是什么意思呢用IDA逆向一下得到了以下字符串playback recording sounds spatial listento custom vendor sysfx advanced levels tone hdmi spdif general communications所以说这写字符串对应的是选项卡的默认起始位置结束。备注下期更精彩

相关新闻

为什么选择Themosis Framework48?WordPress开发者的最佳选择

为什么选择Themosis Framework48?WordPress开发者的最佳选择

为什么选择Themosis Framework48?WordPress开发者的最佳选择 【免费下载链接】framework The Themosis framework core. 项目地址: https://gitcode.com/gh_mirrors/framework48/framework Themosis Framework48是专为WordPress开发者打造的终极框架&#xf…

2026/9/28 22:55:25 阅读更多 →
团队协同办公工具记录:多款企业协作平台能力边界整理

团队协同办公工具记录:多款企业协作平台能力边界整理

日常企业项目推进、任务分配、流程审批、内部资料流转沟通时,不同协同平台在功能集成、权限管控、文件存储、行业适配能力上存在差异。下文客观记录多款协同工具基础能力与使用局限,本文无任何商业合作,不区分好坏优劣,仅作为团队…

2026/9/29 8:44:57 阅读更多 →
Hadoop+Spark+Hive构建智能招聘推荐系统实践

Hadoop+Spark+Hive构建智能招聘推荐系统实践

1. 项目概述这个基于HadoopSparkHive的招聘推荐系统,本质上是一个典型的大数据应用项目。它通过整合主流的大数据技术栈,实现了对海量招聘数据的存储、处理和分析,最终输出智能化的职位推荐结果。从技术架构来看,项目涵盖了从数据…

2026/10/10 22:22:20 阅读更多 →

最新新闻

Android TextureView视频播放异常解决方案

Android TextureView视频播放异常解决方案

1. 问题现象与背景解析在Android应用开发中,TextureView作为SurfaceView的升级替代方案,因其支持动画变换和灵活布局的特性,已成为视频播放功能的首选组件。但在实际开发中,不少开发者会遇到一个看似简单却令人困惑的报错&#xf…

2026/10/13 9:36:25 阅读更多 →
Java二手交易平台毕设课设实战:从技术选型到部署避坑

Java二手交易平台毕设课设实战:从技术选型到部署避坑

简介:这是一套面向高校计算机相关专业学生的Java二手交易平台项目源码,适用于毕业设计、课程设计及个人练手场景,帮助解决从选题到落地实现完整业务系统的需求。项目基于JDK1.8与Spring Boot框架搭建,采用Maven管理依赖&#xff0…

2026/10/13 9:36:25 阅读更多 →
极简自动化部署工具:轻量化CI/CD实践指南

极简自动化部署工具:轻量化CI/CD实践指南

1. 项目概述:极简自动化部署工具的核心价值在持续交付成为标配的今天,部署效率直接决定团队生产力。传统CI/CD工具虽然功能强大,但存在两个致命痛点:一是学习曲线陡峭,二是资源消耗严重。这正是我们开发这款极轻量自动…

2026/10/13 9:36:25 阅读更多 →
Markdown规范与高效写作全指南

Markdown规范与高效写作全指南

1. Markdown文件规范的核心价值在技术文档写作领域,Markdown已经成为事实上的标准格式。这种轻量级标记语言的最大优势在于其可读性和可移植性——纯文本的特性使得它几乎可以在任何设备上被编辑和查看,而简单的语法规则又保证了内容的结构化呈现。特别是…

2026/10/13 9:36:25 阅读更多 →
从慢到快!插入排序到希尔排序的进化之路,一次讲透

从慢到快!插入排序到希尔排序的进化之路,一次讲透

插入排序1、插入排序--以抓扑克开始逐层通俗讲解在玩扑克牌时,你的左手拿着已经排好序的牌(有序区),右手不断从牌堆摸新牌(无序区),每一次摸新牌,就在左手的手牌里从右往左比对&…

2026/10/13 9:36:25 阅读更多 →
Hibernate多表查询优化:四种实现与性能调优

Hibernate多表查询优化:四种实现与性能调优

1. Hibernate多表联合查询的核心场景与挑战在企业级应用开发中,超过80%的业务场景需要处理关联数据查询。我经历过一个电商项目,订单查询需要同时关联用户表、商品表和物流表,最初用简单查询导致每次页面加载需要执行12次SQL查询,…

2026/10/13 9:35:23 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →