if ((GetWindowThreadProcessId(hwndApp, NULL)) == dwProcessId) 부근에서 발생했다고 하는데 왜 그런지 알수 있을까요
#include <Windows.h>
#include<stack>
#include <iostream>
#include <conio.h>
#include <mmdeviceapi.h>
#include <endpointvolume.h>
#include <Audioclient.h>
#include <audiopolicy.h>
using namespace std;
void HideWindow();
void ShowWindow();
void Sound();
stack<HWND> st = {};
char c;
// 오디오 세션을 찾아서 볼륨을 조절하고 음소거 상태를 변경하는 함수
HRESULT AdjustVolumeForSpecificApplication(HWND hwndApp, float fLevel, BOOL bMute) {
CoInitialize(NULL);
IMMDeviceEnumerator* pDeviceEnumerator = NULL;
IMMDevice* pDevice = NULL;
IAudioSessionManager2* pSessionManager = NULL;
IAudioSessionEnumerator* pSessionList = NULL;
IAudioSessionControl2* pSessionControl = NULL; // IAudioSessionControl2로 변경
ISimpleAudioVolume* pAudioVolume = NULL;
// 디바이스 열거자를 생성합니다.
CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), (void**)&pDeviceEnumerator);
// 기본 오디오 엔드포인트를 가져옵니다.
pDeviceEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pDevice);
pDevice->Activate(__uuidof(IAudioSessionManager2), CLSCTX_ALL, NULL, (void**)&pSessionManager);
// 오디오 세션 목록을 가져옵니다.
pSessionManager->GetSessionEnumerator(&pSessionList);
int nSessionCount = 0;
pSessionList->GetCount(&nSessionCount);
// 모든 오디오 세션을 순회하면서 특정 응용 프로그램의 세션을 찾습니다.
for (int i = 0; i < nSessionCount; ++i) {
pSessionList->GetSession(i, (IAudioSessionControl**)&pSessionControl);
DWORD dwProcessId = 0;
pSessionControl->GetProcessId(&dwProcessId); // IAudioSessionControl2의 GetProcessId 사용
// hwndApp에 해당하는 프로세스 ID를 찾습니다.
if ((GetWindowThreadProcessId(hwndApp, NULL)) == dwProcessId) {
pSessionControl->QueryInterface(__uuidof(ISimpleAudioVolume), (void**)&pAudioVolume);
// 볼륨을 조절하고 음소거 상태를 변경합니다.
pAudioVolume->SetMasterVolume(fLevel, NULL);
pAudioVolume->SetMute(bMute, NULL);
pAudioVolume->Release();
break;
}
pSessionControl->Release();
}
// 사용이 끝난 후 COM 객체를 정리합니다.
pSessionList->Release();
pSessionManager->Release();
pDevice->Release();
pDeviceEnumerator->Release();
CoUninitialize();
return S_OK;
}
int main()
{
ShowWindow(GetConsoleWindow(), SW_SHOW);
while(1)
{
if (GetKeyState(VK_CONTROL) < 0)
if (GetKeyState(VK_ESCAPE) < 0)
{
ShowWindow();
ShowWindow(GetConsoleWindow(), SW_SHOW);
break;
}
if (_kbhit)
{
if (GetAsyncKeyState(VK_F1) & 0x0001)
{
ShowWindow();
}
if (GetAsyncKeyState(VK_F2) & 0x0001)
{
HideWindow();
}
}
}
}
bool func(char* a)
{
return strcmp(a, "Shell_TrayWnd")&& strcmp(a, "Progman");
}
void HideWindow()
{
HWND hWnd;
POINT point;
GetCursorPos(&point);
hWnd = WindowFromPoint(point);
char clsName_v[256];
HWND parent = GetParent(hWnd), parent2;
while (1) {
parent2 = GetParent(parent);
if (parent2 == 0)
break;
parent = parent2;
}
if (parent != 0)
hWnd = parent;
GetClassNameA(hWnd, clsName_v, 256);
std::cout << hWnd << "\n";
std::cout << clsName_v << "\n";
if (func(clsName_v))
{
st.push(hWnd);
ShowWindow(hWnd, SW_HIDE);
AdjustVolumeForSpecificApplication(hWnd, 0.5f, TRUE);
}
}
void ShowWindow()
{
while (!st.empty())
{
ShowWindow(st.top(), SW_SHOW);
st.pop();
}
}