#include <iostream>

#include <mmdeviceapi.h>

#include <audiopolicy.h>

#include <comdef.h>

#include <psapi.h>


#pragma comment(lib, "ole32.lib")

#pragma comment(lib, "oleaut32.lib")


template <class T>

void SafeRelease(T** ppT) {

    if(*ppT) {

        (*ppT)->Release();

        *ppT = NULL;

    }

}


std::wstring GetProcessName(DWORD processID) {

    char processName[MAX_PATH] = "<unknown>";

    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID);

    if(hProcess != NULL) {

        HMODULE hMod = NULL;

        DWORD cbNeeded = -1;

        if(EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded)) {

            GetModuleBaseNameA(hProcess, hMod, processName, sizeof(processName) / sizeof(char));

        }

    }

    CloseHandle(hProcess);

    std::string temp(processName);

    return std::wstring(temp.begin(), temp.end());

}


int main() {

    CoInitialize(NULL);


    IMMDeviceEnumerator* pEnumerator = NULL;

    CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, IID_PPV_ARGS(&pEnumerator));


    IMMDevice* pDevice = NULL;

    pEnumerator->GetDefaultAudioEndpoint(eRender, eMultimedia, &pDevice);


    IAudioSessionManager2* pSessionManager = NULL;

    pDevice->Activate(__uuidof(IAudioSessionManager2), CLSCTX_ALL, NULL, (void**) &pSessionManager);


    IAudioSessionEnumerator* pSessionList = NULL;

    pSessionManager->GetSessionEnumerator(&pSessionList);


    int sessionCount = -1;

    pSessionList->GetCount(&sessionCount);


    for(int i = 0; i < sessionCount; i++) {

        IAudioSessionControl* pSessionControl = NULL;

        pSessionList->GetSession(i, &pSessionControl);


        IAudioSessionControl2* pSessionControl2 = NULL;

        HRESULT hr = pSessionControl->QueryInterface(__uuidof(IAudioSessionControl2), (void**) &pSessionControl2);

        if(SUCCEEDED(hr)) {

            DWORD processId = -1;

            pSessionControl2->GetProcessId(&processId);

            std::wstring processName = GetProcessName(processId);


            // 여기서 할 일 하면 됨

            std::wcout << L"PID: " << processId << ", Name: " << processName << std::endl;


            pSessionControl2->Release();

        }

        pSessionControl->Release();

    }


    SafeRelease(&pSessionList);

    SafeRelease(&pSessionManager);

    SafeRelease(&pDevice);

    SafeRelease(&pEnumerator);


    CoUninitialize();

    return 0;

}


--------

이거 그대로 가져다 쓰지 마셈. 그대로 쓴다면 발생하는 문제는 감수할 것

일단 오디오 쓰는 프로세스는 다 잡는거 같아서 올림