I am building an app that starts a screen recorder application (like OBS) automatically (to record a zoom meeting).
I don't want any other application's audio to play during the recording, but I can't find a working code.
I used the example in this site with some code from here just to check the API
public enum MMRESULT : uint
{
// Source: https://www.pinvoke.net/default.aspx/winmm/MMRESULT.html?diff=y
MMSYSERR_NOERROR = 0,
MMSYSERR_ERROR = 1,
MMSYSERR_BADDEVICEID = 2,
MMSYSERR_NOTENABLED = 3,
MMSYSERR_ALLOCATED = 4,
MMSYSERR_INVALHANDLE = 5,
MMSYSERR_NODRIVER = 6,
MMSYSERR_NOMEM = 7,
MMSYSERR_NOTSUPPORTED = 8,
MMSYSERR_BADERRNUM = 9,
MMSYSERR_INVALFLAG = 10,
MMSYSERR_INVALPARAM = 11,
MMSYSERR_HANDLEBUSY = 12,
MMSYSERR_INVALIDALIAS = 13,
MMSYSERR_BADDB = 14,
MMSYSERR_KEYNOTFOUND = 15,
MMSYSERR_READERROR = 16,
MMSYSERR_WRITEERROR = 17,
MMSYSERR_DELETEERROR = 18,
MMSYSERR_VALNOTFOUND = 19,
MMSYSERR_NODRIVERCB = 20,
WAVERR_BADFORMAT = 32,
WAVERR_STILLPLAYING = 33,
WAVERR_UNPREPARED = 34
}
[DllImport("winmm.dll")]
public static extern MMRESULT waveOutGetVolume(IntPtr hwo, out uint dwVolume);
[DllImport("winmm.dll")]
public static extern MMRESULT waveOutSetVolume(IntPtr hwo, uint dwVolume);
public static void Main(string[] args)
{
foreach (Process process in Process.GetProcesses())
{
if (process.MainWindowHandle != IntPtr.Zero)
{
// Source: https://sites.google.com/site/lalitpundir/s-1
try
{
uint CurrVol = 0;
// At this point, CurrVol gets assigned the volume
MMRESULT res = waveOutGetVolume(process.Handle, out CurrVol);
// Calculate the volume
ushort CalcVol = (ushort)(CurrVol & 0x0000ffff);
// Get the volume on a scale of 1 to 10 (to fit the trackbar)
Console.WriteLine($"The volume of {process.ProcessName} is {CalcVol / (ushort.MaxValue / 10)}");
// Try muting chrome
if (process.ProcessName.Equals("chrome"))
{
Console.WriteLine("Muting chrome");
int NewVolume = 0;
uint NewVolumeAllChannels = (((uint)NewVolume & 0x0000ffff) | ((uint)NewVolume << 16));
res = waveOutSetVolume(process.Handle, NewVolumeAllChannels);
Console.WriteLine(res);
Thread.Sleep(5000);
}
}
catch (Win32Exception e)
{
Console.WriteLine($"Error with {process.ProcessName}");
}
}
}
}
The above code, always returns MMSYSERR_BADDEVICEID
for the waveOutGetVolume
and waveOutSetVolume
methods.