我目前正在编程,但我遇到了一个小问题,即:
在将用作CodeDom编译器源的模块中使用Me.Handle
。
我想要或者更需要在以下过程中使用它:
Private Const APPCOMMAND_VOLUME_MUTE As Integer = &H80000
Private Const WM_APPCOMMAND As Integer = &H319
Declare Function SendMessageW Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
Private Sub Mute()
SendMessageW(Me.Handle, WM_APPCOMMAND, Me.Handle, CType(APPCOMMAND_VOLUME_MUTE, IntPtr))
End Sub
你明白了,我想把System-Sound静音。我或多或少地寻找一些做法
这没有使用Me.Handle
,因为它出于某种原因在我的模块中不起作用......
感谢任何帮助,先谢谢你们!
答案 0 :(得分:2)
SendMessage需要表单的句柄,您在模块或标准类中没有这种句柄。
三个选项要么传入对这样的表单的引用:
Private Sub Mute(formRef As Form)
SendMessageW(formRef.Handle, WM_APPCOMMAND, formRef.Handle, CType(APPCOMMAND_VOLUME_MUTE, IntPtr))
End Sub
或者使用集合中第一个表单的句柄:
Private Sub Mute()
SendMessageW(Application.OpenForms(0).Handle, WM_APPCOMMAND, Application.OpenForms(0).Handle, CType(APPCOMMAND_VOLUME_MUTE, IntPtr))
End Sub
或使用对MainWindowHandle的引用:
Private Sub Mute()
SendMessageW(Process.GetCurrentProcess().MainWindowHandle, WM_APPCOMMAND, Process.GetCurrentProcess().MainWindowHandle, CType(APPCOMMAND_VOLUME_MUTE, IntPtr))
End Sub
答案 1 :(得分:1)
作为替代方案,您可以使用Vista Core Audio API
我写的示例类:
Public Class MasterVolume
''' <summary>
''' The device enumerator.
''' </summary>
Private DeviceEnumerator As New CoreAudioApi.MMDeviceEnumerator()
''' <summary>
''' The default device.
''' </summary>
Private DefaultDevice As CoreAudioApi.MMDevice =
DeviceEnumerator.GetDefaultAudioEndpoint(CoreAudioApi.EDataFlow.eRender, CoreAudioApi.ERole.eMultimedia)
''' <summary>
''' Gets or sets the current volume.
''' </summary>
''' <value>The current volume.</value>
Public Property Volume As Integer
Get
Return CInt(Me.DefaultDevice.AudioEndpointVolume.MasterVolumeLevelScalar * 100I)
End Get
Set(ByVal value As Integer)
Me.DefaultDevice.AudioEndpointVolume.MasterVolumeLevelScalar = CSng(value / 100I)
End Set
End Property
''' <summary>
''' Mutes the volume.
''' </summary>
Public Sub Mute()
Me.DefaultDevice.AudioEndpointVolume.Mute = True
End Sub
''' <summary>
''' Unmutes the volume.
''' </summary>
Public Sub Unmute()
Me.DefaultDevice.AudioEndpointVolume.Mute = False
End Sub
End Class
示例用法:
Private Sub Test() Handles MyBase.Shown
Dim MasterVolume As New MasterVolume
With MasterVolume
' Mutes the device.
.Mute()
' Unmutes the device.
.Unmute()
' Set device volume at 50%
.Volume = 50I
' Shows the current device volume.
MessageBox.Show(String.Format("Current Vol.: {0}%", .Volume()))
End With
End Sub
答案 2 :(得分:0)
好吧,我通过这样做设法解决了这个问题:
Private frm As New System.Windows.Forms.Form()
SendMessageW(frm.Handle, WM_APPCOMMAND, frm.Handle, CType(APPCOMMAND_VOLUME_MUTE, IntPtr))
这基本上就是它在模块内部所做的事情,谢谢!