C# 是否使用win32 waveOutSetVolume函数设置目标进程的卷?
我想设置正在播放音频的指定进程的音量 我发现我可以用C# 是否使用win32 waveOutSetVolume函数设置目标进程的卷?,c#,vb.net,winapi,audio,pinvoke,C#,Vb.net,Winapi,Audio,Pinvoke,我想设置正在播放音频的指定进程的音量 我发现我可以用waveOutSetVolumeWinAPI函数来实现它,因为它是按照流程工作的,但是,在阅读了下面的文档之后,我仍然不知道如何实现它 我正在C#或VB.Net中寻找解决方案 这是我的waveOutSetVolume公司: <DllImport("winmm.dll", EntryPoint:="waveOutSetVolume", SetLastError:=True)> Friend Shared Function Wa
waveOutSetVolume
WinAPI函数来实现它,因为它是按照流程工作的,但是,在阅读了下面的文档之后,我仍然不知道如何实现它
<DllImport("winmm.dll", EntryPoint:="waveOutSetVolume", SetLastError:=True)>
Friend Shared Function WaveOutSetVolume(byval hwo As IntPtr,
byval dwVolume As UInteger) As Integer
End Function
朋友共享功能WaveOutSetVolume(byval hwo作为IntPtr,
byval dwVolume(作为UInteger)作为整数
端函数
这就是我试图调用函数的方式:
Public Sub SetVolume(ByVal hwo As IntPtr, ByVal volume As Integer)
If (volume < 0) OrElse (volume > 100) Then
Throw New ArgumentOutOfRangeException(
paramName:="volume",
message:="A value between 0 and 100 is required.")
Else
Dim valueFromPercent As UShort = CUShort(volume / (100US / UShort.MaxValue))
' Left channel volume
Dim loBytes As Byte() = BitConverter.GetBytes(valueFromPercent)
' Right channel volume
Dim hiBytes As Byte() = BitConverter.GetBytes(valueFromPercent)
Dim dWord As UInteger =
BitConverter.ToUInt32(loBytes.Concat(hiBytes).ToArray, 0)
NativeMethods.WaveOutSetVolume(hwo, dWord)
End If
End Sub
Public Sub-SetVolume(ByVal hwo作为IntPtr,ByVal volume作为整数)
如果(体积<0)或(体积>100),则
抛出新ArgumentOutOfRangeException(
paramName:=“卷”,
消息:=“需要一个介于0和100之间的值。”)
其他的
Dim VALUES FROMPERCENT As UShort=CUShort(体积/(100US/UShort.MaxValue))
'左声道音量
Dim loBytes As Byte()=位转换器.GetBytes(valueFromPercent)
'右通道音量
将hiBytes设置为Byte()=位转换器.GetBytes(valueFromPercent)
作为UInteger的尺寸dWord=
位转换器.ToUInt32(loBytes.Concat(hiBytes.ToArray,0)
NativeMethods.WaveOutSetVolume(hwo,dWord)
如果结束
端接头
我知道hwo与进程句柄不同,但正如我所说的,我不知道如何发现进程的hwo
注意:我的DWORD计算似乎不是问题,因为如果我将
Intptr.Zero
传递给函数,那么它将设置当前应用程序的预期音量。传递给幻影下选器,您想解释一下为什么这样的问题值得投反对票吗?。很可能您必须在您的过程中创建一个问题,例如使用(可能涉及其他额外任务),或枚举可用的兼容设备,并传递设备ID。@CristiFati感谢您的评论,但请注意,我可以在不使用waveOutOpen等附加功能的情况下设置调用方应用程序的音量,或者我可能理解错误,您的意思是从我的应用程序中使用该功能打开/访问其他应用程序的波形。否决票可能是因为您尝试执行的操作不可能,这就像更改Windows从外部进程渲染进程内部按钮的方式一样。您可以在自己的应用程序中执行类似操作,您可以修改两个应用程序,以便它们进行通信,然后让第二个进程修改自己的卷,但这是您所能达到的最佳效果。您是对的,我误解了这个问题。我不知道有什么方法可以从指定的流程中获取hwo(但我认为这是该流程的内部内容,即使您这样做了,您也无法使用它)。我正在设想一种解决方法,创建一个hwo,获取与之相关联的设备id,并在该设备上操作,以及(我在此仅假设)链接到设备id的所有hwo。到幻影下载器,您想解释一下为什么这样的问题值得投反对票吗?。很可能您必须在您的过程中创建一个问题,例如使用(可能涉及其他额外任务),或枚举可用的兼容设备,并传递设备ID。@CristiFati感谢您的评论,但请注意,我可以在不使用waveOutOpen等附加功能的情况下设置调用方应用程序的音量,或者我可能理解错误,您的意思是从我的应用程序中使用该功能打开/访问其他应用程序的波形。否决票可能是因为您尝试执行的操作不可能,这就像更改Windows从外部进程渲染进程内部按钮的方式一样。您可以在自己的应用程序中执行类似操作,您可以修改两个应用程序,以便它们进行通信,然后让第二个进程修改自己的卷,但这是您所能达到的最佳效果。您是对的,我误解了这个问题。我不知道有什么方法可以从指定的流程中获取hwo(但我认为这是该流程的内部内容,即使您这样做了,您也无法使用它)。我正在设想一种解决方法,创建一个硬件操作系统,获取与之相关联的设备id,并在该设备上操作,以及(我在此仅假设)链接到该设备id的所有硬件操作系统。