使用例子如下:

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. Vue项目开发目录结构

    最近做一些CI+Vue开发的简单项目,由于刚开始一直从事后端,对Vue了解不是很多,fork了团队的项目代码发现项目的文件夹很多,一时间有些懵,上网上参考了部分资料,博客园中的放晴的天空与狮子爱吃草两 ...

  2. 2018青岛网络赛G - Couleur 区间上的启发式合并

    题意:给出\(a[1...n]\),共\(n\)次操作,每次删除一个位置\(p_i\)(强制在线),此时区间会变为两个分离的区间,求每次操作的最大区间逆序对 首先要知道必要的工具,按权值建立的主席树可 ...

  3. Python pip离线部署

    因为生产环境不能联网,必须使用离线部署pip包,倒也不用部署Pypi镜像那么大工作量,其实蛮简单的,贴出了备忘 pip download -r requirements.txt -d packages ...

  4. mono for android之文件系统与应用程序首选项(转)

    Aside from persistent files, your application might need to store cache data in a file. To do that, ...

  5. Python 两种获取文件大小的方法

    import os r=os.path.getsize("/root/catbird1.stl") f=open("/root/catbird1.stl",&q ...

  6. jquery mobile 动态加载标签时,无法正常展示样式

    原因 在chrome中审查元素,发现其增加了很多没有直接写在页面上的标签和样式.页面标签首先经过jquery.mobile-1.4.5.min.js的处理,添加了许多标签,然后再用css布局 解决方案 ...

  7. Touch事件机制

    1.概念 Touch事件分发中有三个主角:Activity.ViewGroup和View.Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewG ...

  8. vuex requires a Promise polyfill in this browser

    ie 浏览器访问 vue 项目(使用的vuex 状态管理组件)报错:vuex requires a Promise polyfill in this browser 处理办法: 1.npm insta ...

  9. html5电池状态相关API

    var battery = navigator.battery || navigator.webkitBattery || navigator.mozBattery || navigator.msBa ...

  10. WPF中Popup等弹窗的位置不对(偏左或者偏右)

    1.情况如图: 正常情况:         部分特殊情况: 在一般的电脑都能正确显示,就是第一种情况,同样的代码为什么在不同的电脑就会显示不同的位置呢,原来Windows为了满足 不同需求的用户,左撇 ...