開発環境 Microsoft Visual C++ 2012 Express
実行環境 Microsoft Windows 7 Home Premium (SP1)
プロジェクトの種類 Win32 プロジェクト
プロジェクト名 MasterVolume
アプリケーションの種類 Windows アプリケーション
追加のオプション 空のプロジェクト
文字セット Unicode

参考

MasterVolume.cpp
//#pragma comment(lib, "mmdevapi.lib")
 
#include <Windows.h>
#include <CommCtrl.h>
#include <mmdeviceapi.h>
#include <endpointvolume.h>
#include <tchar.h>
#include "resource.h"
 
#define SAFE_RELEASE(punk) if(punk){punk->Release();punk=NULL;}
 
// 関数プロトタイプ宣言
int GetIniFileName(void);
int InitApp(void);
void ExitApp(void);
INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
void OnHScroll(void);
void OnInitDialog(HWND hDlg);
void OnDestroy(HWND hDlg);
void WriteIniFileInt(LPCTSTR szSect, LPCTSTR szKey, int iValue);
void SetVolume(int iPos);
 
// 外部変数
TCHAR g_szIniFile[_MAX_PATH];
HWND g_hVolume;
HWND g_hSlider;
IMMDeviceEnumerator *g_pEnum = NULL;
IMMDevice *g_pEndpoint = NULL;
IAudioEndpointVolume *g_pAudioEndVol = NULL;
float g_fVolLv;
 
//==============================================================================
int WINAPI _tWinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPTSTR lpCmdLine,
	int nCmdShow)
{
	HRESULT hr;
 
	hr = CoInitialize(NULL);
	if (FAILED(hr)) {
		return 0;
	}
	if (GetIniFileName()) {
		return 0;
	}
	if (InitApp()) {
		return 0;
	}
	DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, DialogProc);
	ExitApp();
	CoUninitialize();
	return 0;
}
 
//------------------------------------------------------------------------------
int GetIniFileName(void)
{
	TCHAR szPath[_MAX_PATH];
	TCHAR szDrive[_MAX_DRIVE];
	TCHAR szDir[_MAX_DIR];
	TCHAR szFName[_MAX_FNAME];
	TCHAR szExt[_MAX_EXT];
 
	if (GetModuleFileName(NULL, szPath, _countof(szPath)) == 0) {
		return -1;
	}
	if (_tsplitpath_s(szPath, szDrive, szDir, szFName, szExt) != 0) {
		return -1;
	}
	if (_tmakepath_s(g_szIniFile, szDrive, szDir, szFName, _T("ini")) != 0) {
		return -1;
	}
	return 0;
}
 
//------------------------------------------------------------------------------
int InitApp(void)
{
	HRESULT hr;
 
	// オーディオデバイス一覧取得用のインターフェースを取得
	hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL,
		IID_PPV_ARGS(&g_pEnum));
	if (FAILED(hr)) {
		return -1;
	}
 
	// 一覧の中からデフォルトのオーディオデバイスを取得する
	hr = g_pEnum->GetDefaultAudioEndpoint(eRender, eConsole, &g_pEndpoint);
	if (FAILED(hr)) {
		return -1;
	}
 
	// 取得したオーディオデバイスからメインボリューム操作用のインターフェースを取得
	hr = g_pEndpoint->Activate(__uuidof(IAudioEndpointVolume),
		CLSCTX_ALL, NULL, (void **)&g_pAudioEndVol);
	if (FAILED(hr)) {
		return -1;
	}
 
	// メインボリュームの音量を取得 fLevelの範囲は0.0~1.0
	hr = g_pAudioEndVol->GetMasterVolumeLevelScalar(&g_fVolLv);
	if (FAILED(hr)) {
		return -1;
	}
 
	return 0;
}
 
//------------------------------------------------------------------------------
void ExitApp(void)
{
	SAFE_RELEASE(g_pAudioEndVol);
	SAFE_RELEASE(g_pEndpoint);
	SAFE_RELEASE(g_pEnum);
}
 
//==============================================================================
INT_PTR CALLBACK DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	INT_PTR iRet = TRUE;	// メッセージを処理した
 
	switch (uMsg) {
	case WM_HSCROLL:
		OnHScroll();
		break;
	case WM_INITDIALOG:
		OnInitDialog(hDlg);
		iRet = TRUE;	// SetFocusでフォーカスを設定した場合はFALSE
		break;
	case WM_CLOSE:
		EndDialog(hDlg, IDOK);
		break;
	case WM_DESTROY:
		OnDestroy(hDlg);
		break;
	default:
		iRet = FALSE;	// メッセージを処理しなかった
	}
	return iRet;
}
 
//------------------------------------------------------------------------------
void OnHScroll(void)
{
	int iPos;
	float fLevel;
	HRESULT hr;
 
	iPos = SendMessage(g_hSlider, TBM_GETPOS, 0, 0);
	SetVolume(iPos);
 
	// メインボリュームの音量を変更 fLevelの範囲は0.0~1.0
	fLevel = iPos / (float)100;
	hr = g_pAudioEndVol->SetMasterVolumeLevelScalar(fLevel, &GUID_NULL);
}
 
//------------------------------------------------------------------------------
void OnInitDialog(HWND hDlg)
{
	int iX, iY;
	int iPos;
 
	iX = GetPrivateProfileInt(_T("General"), _T("x"), 0, g_szIniFile);
	iY = GetPrivateProfileInt(_T("General"), _T("y"), 0, g_szIniFile);
	SetWindowPos(hDlg, HWND_TOP, iX, iY, 0, 0, SWP_NOSIZE);
 
	g_hVolume = GetDlgItem(hDlg, IDC_VOLUME);
	g_hSlider = GetDlgItem(hDlg, IDC_SLIDER);
	SendMessage(g_hSlider, TBM_SETRANGE, FALSE, MAKELPARAM(0, 100));
	iPos = (int)(100 * g_fVolLv);
	SendMessage(g_hSlider, TBM_SETPOS, TRUE, iPos);
	SetVolume(iPos);
}
 
//------------------------------------------------------------------------------
void OnDestroy(HWND hDlg)
{
	RECT rc;
 
	if (IsIconic(hDlg)) {
		return;
	}
	GetWindowRect(hDlg, &rc);
	WriteIniFileInt(_T("General"), _T("x"), rc.left);
	WriteIniFileInt(_T("General"), _T("y"), rc.top);
}
 
//------------------------------------------------------------------------------
void WriteIniFileInt(LPCTSTR szSect, LPCTSTR szKey, int iValue)
{
	TCHAR szBuf[16];
 
	_stprintf_s(szBuf, _T("%d"), iValue);
	WritePrivateProfileString(szSect, szKey, szBuf, g_szIniFile);
}
 
//------------------------------------------------------------------------------
void SetVolume(int iPos)
{
	TCHAR szBuf[16];
 
	_stprintf_s(szBuf, _T("%d"), iPos);
	SetWindowText(g_hVolume, szBuf);
}
 

resource.h
#define IDC_STATIC	-1
#define IDD_DIALOG	100
#define IDC_VOLUME	1000
#define IDC_SLIDER	1001
 

MasterVolume.rc
// resource script
#include <windows.h>
#include "resource.h"
 
IDD_DIALOG DIALOGEX 0, 0, 240, 48
STYLE WS_POPUPWINDOW | WS_MINIMIZEBOX
EXSTYLE WS_EX_APPWINDOW
CAPTION "MasterVolume"
FONT 9, "MS Pゴシック"
BEGIN
	LTEXT		"0",IDC_STATIC,4,4,20,8
	LTEXT		"100",IDC_STATIC,200,4,20,8
	LTEXT		"",IDC_VOLUME,100,4,20,8
	CONTROL		"",IDC_SLIDER,"msctls_trackbar32",
			TBS_BOTH | WS_TABSTOP,4,16,200,24
END
 
最終更新:2012年10月03日 08:27