Изменить уровень громкости системы в окнах
Мое приложение должно иметь возможность изменять уровни громкости системы для звуковых устройств. Я использую C# с NAudio. Я попытался использовать CoreAudio Api в NAudio, но это не работает в Windows XP, однако моя программа должна поддерживать XP. Пожалуйста, помогите мне, что мне нужно использовать, чтобы моя программа поддерживала XP и последнюю версию Windows.
1 ответ
Вот самый простой и известный метод с использованием вызовов P/Invoke:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace VolumeControl
{
public partial class Form1 : Form
{
[DllImport("winmm.dll")]
public static extern int waveOutGetVolume(IntPtr hwo, out uint dwVolume);
[DllImport("winmm.dll")]
public static extern int waveOutSetVolume(IntPtr hwo, uint dwVolume);
public Form1()
{
InitializeComponent();
// By the default set the volume to 0
uint CurrVol = 0;
// At this point, CurrVol gets assigned the volume
waveOutGetVolume(IntPtr.Zero, out CurrVol);
// Calculate the volume
ushort CalcVol = (ushort)(CurrVol & 0x0000ffff);
// Get the volume on a scale of 1 to 10 (to fit the trackbar)
trackWave.Value = CalcVol / (ushort.MaxValue / 10);
}
private void trackWave_Scroll(object sender, EventArgs e)
{
// Calculate the volume that's being set
int NewVolume = ((ushort.MaxValue / 10) * trackWave.Value);
// Set the same volume for both the left and the right channels
uint NewVolumeAllChannels = (((uint)NewVolume & 0x0000ffff) | ((uint)NewVolume << 16));
// Set the volume
waveOutSetVolume(IntPtr.Zero, NewVolumeAllChannels);
}
}
}
Источник: http://www.geekpedia.com/tutorial176_Get-and-set-the-wave-sound-volume.html
Кроме того, если вы хотите объединить это для работы с CoreAudioAPI - прочитайте это: Измените громкость основного звука с XP на Windows 8 в C#
В cmd я обнаружил, что вы можете запустить javascript и использовать клавиши громкости оттуда. Я знаю, что это будет работать автономно в командном файле в Windows 10
Вы можете повторить shl.SendKeys(String.fromCharCode(0xAF))
столько раз, сколько вам нужно, каждый раз увеличивая громкость на 10
@if (@a==@b) @end /*
:: batch portion
@ECHO OFF
cscript /e:jscript "%~f0"
:: JScript portion */
var shl = new ActiveXObject("WScript.Shell");
for (var i=0; i<5; i++) {
shl.SendKeys(String.fromCharCode(0xAF));
}