開発環境 |
Microsoft Visual C++ 2010 Express (SP1) |
実行環境 |
Microsoft Windows XP Home Edition (SP3) |
プロジェクトの種類 |
Win32 プロジェクト |
プロジェクト名 |
MasterVolume |
アプリケーションの種類 |
Windows アプリケーション |
追加のオプション |
空のプロジェクト |
文字セット |
Unicode |
Windows XPではマスターボリュームの変更はできたが、
Windows 7ではこのアプリケーションのみ変更できた。
MasterVolume.cpp
#pragma comment(lib, "winmm.lib")
#include <Windows.h>
#include <CommCtrl.h>
#include <tchar.h>
#include "resource.h"
// 関数プロトタイプ宣言
int GetIniFileName(void);
int InitApp(void);
void TermApp(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;
HMIXER g_hmx;
DWORD g_dwControlID;
DWORD g_dwMin;
DWORD g_dwMax;
DWORD g_dwVol;
//==============================================================================
int WINAPI _tWinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
if (GetIniFileName()) {
return 0;
}
if (InitApp()) {
return 0;
}
DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG), NULL, DialogProc);
TermApp();
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)
{
MIXERLINE mxl;
MIXERCONTROL mxctrl;
MIXERLINECONTROLS mxlc;
MIXERCONTROLDETAILS mxcd;
MIXERCONTROLDETAILS_UNSIGNED mxcdVolume;
MMRESULT mr;
// ミキサーデバイス
mr = mixerOpen(&g_hmx, 0, (DWORD_PTR)NULL, 0, MIXER_OBJECTF_MIXER);
if (mr != MMSYSERR_NOERROR) {
return -1;
}
// マスターボリュームID
mxl.cbStruct = sizeof (MIXERLINE);
mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
mr = mixerGetLineInfo((HMIXEROBJ)g_hmx, &mxl,
MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_COMPONENTTYPE);
mxlc.cbStruct = sizeof (MIXERLINECONTROLS);
mxlc.dwLineID = mxl.dwLineID;
mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
mxlc.cControls = 1;
mxlc.cbmxctrl = sizeof (MIXERCONTROL);
mxlc.pamxctrl = &mxctrl;
mr = mixerGetLineControls((HMIXEROBJ)g_hmx, &mxlc,
MIXER_OBJECTF_HMIXER | MIXER_GETLINECONTROLSF_ONEBYTYPE);
g_dwControlID = mxctrl.dwControlID;
g_dwMin = mxctrl.Bounds.dwMinimum;
g_dwMax = mxctrl.Bounds.dwMaximum;
// 現在の音量
mxcd.cbStruct = sizeof (MIXERCONTROLDETAILS);
mxcd.dwControlID = g_dwControlID;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof (MIXERCONTROLDETAILS_UNSIGNED);
mxcd.paDetails = &mxcdVolume;
mr = mixerGetControlDetails((HMIXEROBJ)g_hmx, &mxcd,
MIXER_OBJECTF_HMIXER | MIXER_GETCONTROLDETAILSF_VALUE);
g_dwVol = mxcdVolume.dwValue;
return 0;
}
//------------------------------------------------------------------------------
void TermApp(void)
{
MMRESULT mr;
mr = mixerClose(g_hmx);
}
//==============================================================================
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)
{
MIXERCONTROLDETAILS mxcd;
MIXERCONTROLDETAILS_UNSIGNED mxcdVolume;
MMRESULT mr;
int iPos;
iPos = SendMessage(g_hSlider, TBM_GETPOS, 0, 0);
SetVolume(iPos);
mxcdVolume.dwValue = g_dwMax * iPos / 100;
mxcd.cbStruct = sizeof (MIXERCONTROLDETAILS);
mxcd.dwControlID = g_dwControlID;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof (MIXERCONTROLDETAILS_UNSIGNED);
mxcd.paDetails = &mxcdVolume;
mr = mixerSetControlDetails((HMIXEROBJ)g_hmx, &mxcd,
MIXER_OBJECTF_HMIXER | MIXER_SETCONTROLDETAILSF_VALUE);
}
//------------------------------------------------------------------------------
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 = 100 * g_dwVol / g_dwMax;
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月02日 12:51