使用例子如下:

CAudioMgr AudioMgr;
AudioMgr.SetProcessMute(GetCurrentProcessId());

H文件的内容如下:

#pragma once

#include <Audiopolicy.h>

class CAudioMgr
{
public:
CAudioMgr();
~CAudioMgr(); public:
HRESULT GetHResult() const { return m_hRes; }
BOOL SetProcessMute(const CString& strProcName);
BOOL SetProcessMute(DWORD Pid); private:
BOOL __GetAudioSessionMgr2(); private:
HRESULT m_hRes;
IAudioSessionManager2* m_lpAudioSessionMgr;
};

CPP文件内容如下:

#include "stdafx.h"
#include <mmdeviceapi.h>
#include <Psapi.h>
#include "AudioManager.h" #pragma comment(lib, "Psapi.lib") CAudioMgr::CAudioMgr()
: m_hRes( ERROR_SUCCESS )
, m_lpAudioSessionMgr( NULL )
{
::CoInitialize(NULL);
} CAudioMgr::~CAudioMgr()
{
::CoUninitialize();
} BOOL CAudioMgr::SetProcessMute(DWORD Pid)
{
if ( !this->__GetAudioSessionMgr2() || m_lpAudioSessionMgr == NULL )
{
return FALSE;
} CComPtr<IAudioSessionEnumerator> pAudioSessionEnumerator;
m_hRes = m_lpAudioSessionMgr->GetSessionEnumerator(&pAudioSessionEnumerator);
if ( FAILED(m_hRes) || pAudioSessionEnumerator == NULL )
{
return FALSE;
} int nCount = ;
m_hRes = pAudioSessionEnumerator->GetCount(&nCount); for ( int i = ; i < nCount; ++i )
{
CComPtr<IAudioSessionControl> pAudioSessionControl;
m_hRes = pAudioSessionEnumerator->GetSession(i, &pAudioSessionControl);
if ( FAILED(m_hRes) || pAudioSessionControl == NULL )
{
continue;
} CComQIPtr<IAudioSessionControl2> pAudioSessionControl2(pAudioSessionControl);
if ( pAudioSessionControl2 == NULL )
{
continue;
} DWORD dwPid = ;
m_hRes = pAudioSessionControl2->GetProcessId(&dwPid);
if( FAILED(m_hRes) )
{
continue;
} if ( dwPid == Pid )
{
CComQIPtr<ISimpleAudioVolume> pSimpleAudioVolume(pAudioSessionControl2);
if ( pSimpleAudioVolume == NULL )
{
continue;
} m_hRes = pSimpleAudioVolume->SetMute(TRUE, NULL);
break;
}
} return SUCCEEDED(m_hRes);
} BOOL CAudioMgr::SetProcessMute(const CString& strProcName)
{
if ( !this->__GetAudioSessionMgr2() || m_lpAudioSessionMgr == NULL )
{
return FALSE;
} CComPtr<IAudioSessionEnumerator> pAudioSessionEnumerator;
m_hRes = m_lpAudioSessionMgr->GetSessionEnumerator(&pAudioSessionEnumerator);
if ( FAILED(m_hRes) || pAudioSessionEnumerator == NULL )
{
return FALSE;
} int nCount = ;
m_hRes = pAudioSessionEnumerator->GetCount(&nCount); for ( int i = ; i < nCount; ++i )
{
CComPtr<IAudioSessionControl> pAudioSessionControl;
m_hRes = pAudioSessionEnumerator->GetSession(i, &pAudioSessionControl);
if ( FAILED(m_hRes) || pAudioSessionControl == NULL )
{
continue;
} CComQIPtr<IAudioSessionControl2> pAudioSessionControl2(pAudioSessionControl);
if ( pAudioSessionControl2 == NULL )
{
continue;
} DWORD dwPid = ;
m_hRes = pAudioSessionControl2->GetProcessId(&dwPid);
if( FAILED(m_hRes) )
{
continue;
} CHandle hProcess;
hProcess.Attach(OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid));
if ( hProcess == NULL )
{
continue;
} TCHAR szName[MAX_PATH] = { };
::GetModuleBaseName(hProcess, NULL, szName, MAX_PATH);
if ( strProcName.CompareNoCase(szName) == )
{
CComQIPtr<ISimpleAudioVolume> pSimpleAudioVolume(pAudioSessionControl2);
if ( pSimpleAudioVolume == NULL )
{
continue;
}
m_hRes = pSimpleAudioVolume->SetMute(TRUE, NULL);
break;
}
} return SUCCEEDED(m_hRes);
} BOOL CAudioMgr::__GetAudioSessionMgr2()
{
if ( m_lpAudioSessionMgr == NULL )
{
CComPtr<IMMDeviceEnumerator> pMMDeviceEnumerator; m_hRes = pMMDeviceEnumerator.CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL);
if ( FAILED(m_hRes) || (pMMDeviceEnumerator == NULL) )
{
return FALSE;
} CComPtr<IMMDevice> pDefaultDevice;
m_hRes = pMMDeviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pDefaultDevice);
if( FAILED(m_hRes) || pDefaultDevice == NULL )
{
return FALSE;
} m_hRes = pDefaultDevice->Activate(__uuidof(IAudioSessionManager2), CLSCTX_ALL, NULL, (void**)&m_lpAudioSessionMgr);
if ( FAILED(m_hRes) || (m_lpAudioSessionMgr == NULL) )
{
return FALSE;
}
} return TRUE;
}

【Win32】对指定进程进行禁音的更多相关文章

  1. [Win32]获取指定进程的父进程PID

    // // #include <Windows.h> #include <winnt.h> #include <winternl.h> typedef NTSTAT ...

  2. 使用VC++通过远程进程注入来实现HOOK指定进程的某个API

    前阵子读到一篇关于<HOOK API入门之Hook自己程序的MessageBoxW>的博客,博客地址:http://blog.csdn.net/friendan/article/detai ...

  3. Win32 OpenProcess打开进程失败,返回5无权限操作

    Win32 OpenProcess打开进程失败,返回5无权限操作,相信你会碰到这样的事,在IDE中可以,单独却不可以了,其实这时就需要提权了,否则是无法打开的,OpenProcess提权至Debug即 ...

  4. win32进程名查找进程PID

    1. #include <Psapi.h> #pragma comment(lib, "Psapi.lib") DWORD GetProcIDFromName(LPCT ...

  5. Linux kill 杀死指定进程

    一  杀死指定进程 现知道有一个php线程正在运行,需要杀死 root 26278 1 0 2015 ? 00:00:31 /usr/local/php/bin/php /var/www/html/r ...

  6. Android Studio怎样选择查看指定进程的log?

    今天说一个简单的东东,关于Android Studio在logcat中怎样查看指定进程的log. 关于过滤你自己所开发的应用的log.在这篇文章中:Android Studio怎样给log加入过滤项( ...

  7. linux:如何指定进程运行的CPU

    coolshell最新的文章<性能调优攻略>在"多核CPU调优"章节,提到"我们不能任由操作系统负载均衡,因为我们自己更了解自己的程序,所以,我们可以手动地为 ...

  8. mac查看当前调用tcp的进程并关闭指定进程

    查看所有tcp进程 监听的端口 lsof -iTCP -sTCP:LISTEN 查看指定端口信息 lsof -i: 关闭指定进程 kill -

  9. [转] 指定进程运行的CPU

    转自:https://www.cnblogs.com/liuhao/archive/2012/06/21/2558069.html coolshell最新的文章<性能调优攻略>在“多核CP ...

随机推荐

  1. python 异步IO(syncio) 协程

    python asyncio 网络模型有很多中,为了实现高并发也有很多方案,多线程,多进程.无论多线程和多进程,IO的调度更多取决于系统,而协程的方式,调度来自用户,用户可以在函数中yield一个状态 ...

  2. Spring集成ignite,服务发现问题

    问题: 解决办法: 修改C:\Windows\System32\drivers\etc\hosts 配置主机名和ip对应关系: 试试!

  3. js中的promise详解

    一 概述   Promise是异步编程的一种解决方案,可以替代传统的解决方案--回调函数和事件.ES6统一了用法,并原生提供了Promise对象.作为对象,Promise有一下两个特点: (1)对象的 ...

  4. 关于README的内容

    如何在开发项目的时候写出标准的README文件? 为什么要写这篇博客? 关于README的编写,这个也十分的重要,如果你觉得只是随便写写,那么你就错了:编写这部分也是相当的重要的.工欲善其事,必先利其 ...

  5. 单独安装VS2012装mono for android

    直接安装个SQL Server2012,然后就可以单独安装VS2012 来用mono for android了.如果不想装,那就装以下这些东西. 广州-PC286() 11:05:28 和 x86  ...

  6. RHCE 共享文件系统

    9.1 共享文件系统 概述: 共享文件系统通常有两种方式: 基于文件共享,一种直接共享文件夹给client端,常见的技术有NFS(Network File System )和 SMB (Server ...

  7. 【文档】二、Binlog结构和内容概述

    binlog是一系列文件,这些文件包含了Mysql服务实例中数据的变化. binlog包含一系列二进制日志文件,还包含一个索引文件. 每个日志文件包含了一个4字节的魔法数,后面跟着描述数据变化的事件内 ...

  8. feign中的hytrix和turbin配置

    这里我用了两个生产者和两个消费者进行演示,如下图(画的不好看,凑活看看): 这里我就只讲下怎么注册到dashbord和相关的配置,提供者和消费者等代码可以去下载查看: https://github.c ...

  9. Compile android source and kernel for emulator in Debian

    1.download the android source code Reference from http://source.android.com/source/downloading.html ...

  10. 关于dubbo调度时出现Request processing failed; nested exception is com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method insertTestTb in the service cn.cuibusi.core.service.TestTbService.的解决办法

    在用dubbo跨项目调度service时出现如下错误: 错误原因:pojo没有实现序列化 解决方法:在pojo实现序列化接口即可