Me.Handle in Module - Alternative?

时间:2014-06-27 06:57:47

标签: vb.net audio module codedom

我目前正在编程,但我遇到了一个小问题,即:

在将用作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,因为它出于某种原因在我的模块中不起作用......

感谢任何帮助,先谢谢你们!

3 个答案:

答案 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))

这基本上就是它在模块内部所做的事情,谢谢!