• 【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 = 0;
        m_hRes = pAudioSessionEnumerator->GetCount(&nCount);
    
        for ( int i = 0; 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 = 0;
            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 = 0;
        m_hRes = pAudioSessionEnumerator->GetCount(&nCount);
    
        for ( int i = 0; 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 = 0;
            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] = { 0 };
            ::GetModuleBaseName(hProcess, NULL, szName, MAX_PATH);
            if ( strProcName.CompareNoCase(szName) == 0 )
            {
                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;
    }
  • 相关阅读:
    没有比脚更长的路 没有比人更高的山
    Nginx---应用场景小结
    程序员北漂6年,活着 ---纪念逝去的青春
    程序员/PM怎么让项目预估的时间更加准确
    程序员从技术开发到项目管理PM--思维转变
    什么是MSF
    程序员有七个等级?你又属于哪个等级呢?
    linux之 sed 基础
    linux之awk基础
    centos 7 jenkins 部署
  • 原文地址:https://www.cnblogs.com/yvqvan/p/8716450.html
Copyright © 2020-2023  润新知