How would I go about changing the sound volume in c++ win32? Also how would I mute/unmute it? Thanks for the help!
问题:
回答1:
Two options:
There's an answer to that question here on SO (changing the master volume from C++, which also includes SetMute, etc.)
Have you considered showing the Volume controls and letting the user? If so, I can post some code for that. (You basically just shell out to the volume control applet.
回答2:
Use the waveOutSetVolume
API.
Here's an example:
DWORD dwVolume;
if (waveOutGetVolume(NULL, &dwVolume) == MMSYSERR_NOERROR)
waveOutSetVolume(NULL, 0); // mute volume
// later point in code, to unmute volume...
waveOutSetVolume(NULL, dwVolume);
回答3:
waveOutSetVolume and mixerSetControlDetails only change the volume for your application on Windows Vista and above.
If you want to change the master volume on Vista and beyond, search for the IAudioEndpointVolume interface.
Here's a blog post I wrote on this a couple of years ago.
回答4:
Maybe you should consider to NOT change the global volume. Think about it - if I lower the volume in MediaPlayer all other programs are still as loud as before, and that is exactly what I expect from any program - to only lower it's OWN volume. Of course there might be reasons to change global volume, no offense ;)
回答5:
If all you want to do is change the volume then you can use the virtual key codes to change volume like this:
void changeVolume()
{
INPUT ip={0};
ip.type = INPUT_KEYBOARD;
ip.ki.wVk = VK_VOLUME_UP; //or VOLUME_DOWN or MUTE
SendInput(1, &ip, sizeof(INPUT));
ip.ki.dwFlags = KEYEVENTF_KEYUP;
SendInput(1, &ip, sizeof(INPUT));
}
回答6:
Simplest way to toggle mute is
const int APPCOMMAND_VOLUME_MUTE = 0x80000;
SendMessage(this.Handle, WM_APPCOMMAND, IntPtr.Zero, (IntPtr)APPCOMMAND_VOLUME_MUTE);
In similar way you can trigger +Volume and -Volume keys behavior. Take a look at http://www.blackwasp.co.uk/BasicVolumeControl.aspx and http://msdn.microsoft.com/en-us/library/windows/desktop/ms646247%28v=vs.85%29.aspx
There are also values for things like microphone volume control, but I haven't tried them.
If you need more control over system master volume, you must check Windows version and do 2 versions of code:
Something like aforementioned Changing master volume level for Win XP.
Something like https://stackoverflow.com/a/3437069/1365066 for Vista and higher.