크롬, 엣지와 같은 웹 브라우저는 오디오 세션 pid가 따로 있어서 어쩌질 못하고
롤도 어찌 복구할 순 없었지만 그 외에는 다 됩니다
CTRL + ESC : 나가기
마우스 xbutton2 : 윈도우 숨기기(음소거 포함)
마우스 xbutton1 : 윈도우 다시 보이기(음소거 해제)
F1 : 숨긴 윈도우 전부 보이게 하기
#include <Windows.h>
#include<stack>
#include <iostream>
#include <audiopolicy.h>
#include <mmdeviceapi.h>
#include <endpointvolume.h>
using namespace std;
void HideWindow();
void ShowWindow();
void ShowWindowAll();
stack<HWND> st = {};
char c;
HHOOK keyboardHook;
HHOOK mouseHook;
void SetApplicationVolume(DWORD processId, float volumeLevel) {
HRESULT hr = S_OK;
IMMDeviceEnumerator* enumerator = nullptr;
IMMDevice* device = nullptr;
IAudioSessionManager2* sessionManager = nullptr;
IAudioSessionEnumerator* sessionEnumerator = nullptr;
// Initialize COM library
hr = CoInitialize(nullptr);
if (FAILED(hr)) {
std::cerr << "Failed to initialize COM library" << std::endl;
return;
}
// Create multimedia device enumerator
hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr, CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), reinterpret_cast<void**>(&enumerator));
if (FAILED(hr)) {
std::cerr << "Failed to create device enumerator" << std::endl;
CoUninitialize(); // Uninitialize COM library
return;
}
// Get default audio endpoint device
hr = enumerator->GetDefaultAudioEndpoint(eRender, eConsole, &device);
if (FAILED(hr)) {
std::cerr << "Failed to get default audio endpoint device" << std::endl;
enumerator->Release();
CoUninitialize(); // Uninitialize COM library
return;
}
// Activate audio session manager
hr = device->Activate(__uuidof(IAudioSessionManager2), CLSCTX_ALL, nullptr, reinterpret_cast<void**>(&sessionManager));
if (FAILED(hr)) {
std::cerr << "Failed to activate audio session manager" << std::endl;
device->Release();
enumerator->Release();
CoUninitialize(); // Uninitialize COM library
return;
}
// Get session enumerator
hr = sessionManager->GetSessionEnumerator(&sessionEnumerator);
if (FAILED(hr)) {
std::cerr << "Failed to get session enumerator" << std::endl;
sessionManager->Release();
device->Release();
enumerator->Release();
CoUninitialize(); // Uninitialize COM library
return;
}
// Loop through each audio session
int sessionCount = 0;
hr = sessionEnumerator->GetCount(&sessionCount);
if (SUCCEEDED(hr)) {
for (int i = 0; i < sessionCount; ++i) {
// Get audio session control
IAudioSessionControl* sessionControl = nullptr;
hr = sessionEnumerator->GetSession(i, &sessionControl);
if (SUCCEEDED(hr)) {
// Get process ID of the audio session
DWORD sessionProcessId = 0;
IAudioSessionControl2* sessionControl2 = nullptr;
hr = sessionControl->QueryInterface(__uuidof(IAudioSessionControl2), reinterpret_cast<void**>(&sessionControl2));
if (SUCCEEDED(hr)) {
hr = sessionControl2->GetProcessId(&sessionProcessId);
cout << sessionProcessId << endl;
sessionControl2->Release();
}
if (SUCCEEDED(hr) && sessionProcessId == processId) {
// Get simple audio volume
ISimpleAudioVolume* simpleVolume = nullptr;
hr = sessionControl->QueryInterface(__uuidof(ISimpleAudioVolume), reinterpret_cast<void**>(&simpleVolume));
if (SUCCEEDED(hr)) {
// Set volume level
hr = simpleVolume->SetMasterVolume(volumeLevel, nullptr);
if (FAILED(hr)) {
std::cerr << "Failed to set volume level for session" << std::endl;
}
simpleVolume->Release();
}
}
sessionControl->Release();
}
}
}
// Release resources
sessionEnumerator->Release();
sessionManager->Release();
device->Release();
enumerator->Release();
CoUninitialize(); // Uninitialize COM library
}
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0)
{
if (wParam == WM_XBUTTONDOWN)
{
MSLLHOOKSTRUCT* hookStruct = (MSLLHOOKSTRUCT*)lParam;
if (hookStruct->mouseData == 0x20000)
{
cout << "key : " << hookStruct->mouseData << endl;
HideWindow();
return 1; // 여기로 이동
}
else if (hookStruct->mouseData == 0x10000)
{
ShowWindow();
return 1;
}
}
else if (wParam == WM_XBUTTONUP)
{
return 1;
}
}
return CallNextHookEx(mouseHook, nCode, wParam, lParam); // 이전으로 돌아가도록 변경
}
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0)
{
KBDLLHOOKSTRUCT* kbStruct = (KBDLLHOOKSTRUCT*)lParam;
if (wParam == WM_KEYDOWN)
{
// F1 키를 누른 경우
if (kbStruct->vkCode == VK_F1)
{
ShowWindowAll();
return 1;
}
else if (kbStruct->vkCode == VK_ESCAPE && GetAsyncKeyState(VK_CONTROL) & 0x8000)
{
ShowWindow(GetConsoleWindow(), SW_SHOW);
ShowWindowAll();
UnhookWindowsHookEx(keyboardHook);
UnhookWindowsHookEx(mouseHook);
PostQuitMessage(0);
return 1;
}
else
{
// 다른 키를 누른 경우에는 처리를 계속합니다.
std::cout << "Key pressed: " << kbStruct->vkCode << std::endl;
}
}
if (wParam == WM_KEYUP&&kbStruct->vkCode==VK_F1)
{
return 1;
}
}
// 후킹된 이벤트 처리를 계속합니다.
return CallNextHookEx(keyboardHook, nCode, wParam, lParam);
}
int main()
{
ShowWindow(GetConsoleWindow(), SW_HIDE);
keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0);
HINSTANCE hInstance = GetModuleHandle(NULL);
mouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseProc, NULL, 0);
if (mouseHook == NULL) {
std::cerr << "Failed to install mouse hook!" << std::endl;
return 1;
}
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnhookWindowsHookEx(keyboardHook);
UnhookWindowsHookEx(mouseHook);
}
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);
DWORD processId;
GetWindowThreadProcessId(hWnd, &processId);
SetApplicationVolume(processId, 0.0f);
}
}
void ShowWindowAll()
{
while (!st.empty())
{
ShowWindow();
}
}
void ShowWindow()
{
if (!st.empty())
{
DWORD processId;
GetWindowThreadProcessId(st.top(), &processId);
SetApplicationVolume(processId, 1.0f);
ShowWindow(st.top(), SW_SHOW);
st.pop();
}
}