開発環境 |
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