【Win32】对指定进程进行禁音
使用例子如下:
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】对指定进程进行禁音的更多相关文章
- [Win32]获取指定进程的父进程PID
// // #include <Windows.h> #include <winnt.h> #include <winternl.h> typedef NTSTAT ...
- 使用VC++通过远程进程注入来实现HOOK指定进程的某个API
前阵子读到一篇关于<HOOK API入门之Hook自己程序的MessageBoxW>的博客,博客地址:http://blog.csdn.net/friendan/article/detai ...
- Win32 OpenProcess打开进程失败,返回5无权限操作
Win32 OpenProcess打开进程失败,返回5无权限操作,相信你会碰到这样的事,在IDE中可以,单独却不可以了,其实这时就需要提权了,否则是无法打开的,OpenProcess提权至Debug即 ...
- win32进程名查找进程PID
1. #include <Psapi.h> #pragma comment(lib, "Psapi.lib") DWORD GetProcIDFromName(LPCT ...
- Linux kill 杀死指定进程
一 杀死指定进程 现知道有一个php线程正在运行,需要杀死 root 26278 1 0 2015 ? 00:00:31 /usr/local/php/bin/php /var/www/html/r ...
- Android Studio怎样选择查看指定进程的log?
今天说一个简单的东东,关于Android Studio在logcat中怎样查看指定进程的log. 关于过滤你自己所开发的应用的log.在这篇文章中:Android Studio怎样给log加入过滤项( ...
- linux:如何指定进程运行的CPU
coolshell最新的文章<性能调优攻略>在"多核CPU调优"章节,提到"我们不能任由操作系统负载均衡,因为我们自己更了解自己的程序,所以,我们可以手动地为 ...
- mac查看当前调用tcp的进程并关闭指定进程
查看所有tcp进程 监听的端口 lsof -iTCP -sTCP:LISTEN 查看指定端口信息 lsof -i: 关闭指定进程 kill -
- [转] 指定进程运行的CPU
转自:https://www.cnblogs.com/liuhao/archive/2012/06/21/2558069.html coolshell最新的文章<性能调优攻略>在“多核CP ...
随机推荐
- .crx 文件修改
.crx 文件类型:Chrome Extension 扩展名为.crx的文件是一个插件文件. 解压:使用7zip 修改: notepad++ 打包: Chrome 扩展项
- PHP正则表达式笔记和实例
转自: https://www.cnblogs.com/yafei236/p/4168290.html 本文主要介绍如何在PHP使用正则表达式,并附带几个实例. 这两天工作用到了正则表达式,发现自己 ...
- vSphere虚拟主机安装Centos7系统
经过上一帖的主机设置,这一步就可以开始安装系统了,本次详细记录各个过程并分析结果. Centos7 1.右键点击列表中的虚拟主机,打开控制台. 点击绿色开机键,开始安装. 这里有一个很关键的点,就是上 ...
- java使用freemarker生成word文档
1.原料 开源jar包freemarker.eclipse.一份模板word文档 2.首先设计模板word文档 一般,通过程序输出的word文档的格式是固定的,例如建立一个表格,将表格的标题写好,表格 ...
- Springboot用官方建议访问Html页面并接传值
Springboot用官方建议访问Html页面并接传值 我们以前通常习惯用webapp来防止jsp页面,但是到了Springboot中,官方建议用Static文件夹来存放及静态的资源, 用templa ...
- SPSS学习系列之SPSS Statistics导入读取数据(多种格式)(图文详解)
不多说,直接上干货! SPSS Statistics导入读取数据的步骤: 文件 -> 导入数据 成功! 欢迎大家,加入我的微信公众号:大数据躺过的坑 免费给分享 同时,大 ...
- JavaScript设计模式-6.封装
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- JavaScript数据结构-12.散列碰撞(线性探测法)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- ruby **option作为函数参数,map的key必须是符号
# NEW UNNAMED KEYWORD ARGUMENTSdef new_way(**options)return options[:foo]end# => :new_waynew_way( ...
- transform旋转变换效果
div{ transform:rotate(7deg); -ms-transform:rotate(7deg); /* IE 9 */ -moz-transform:rotate(7deg); /* ...