Question

Check for Window's Audio

Asked by: ADawn

Is there a way that I can check to see if a user has muted Window's audio using code. I have a program that runs in the background that alerts the user if something happens, however, if they mute audio, the alert isn't hear. I'd like to monitor the audio (to see if it is muted), and reset the volume if the user sets it too low. Is there something I can do?

ADawn

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2009-07-09 at 06:04:51ID24556433
Topics

Microsoft Visual Studio Express

,

.Net Editors & IDEs

,

Visual Studio

Participating Experts
1
Points
100
Comments
1

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. Mute Volume with API
    I need the exact code to mute the Main volume and other Devices with an API within VB using windows 98.
  2. No audio
    I have Windows 2000 OS.There is no audio output in my system.I have checked every setting.There is volume icon on task bar.I made sure mute is not checked in by double clicking on volume icon on task bar.No volume is coming when I click on .au file or when I play mp3 files.I ...
  3. No Audio
    I have lost my audio. I have a Dell 4400 PC and Windows XP. System Restore didn't solve the problem. The audio cable is properly connected. None of the Play Control items is muted. When I go to Sounds in the Control Panel, Windows Default is selected. When I go to Sounds Trou...
  4. Lose Audio
    Occasionally, 4 or 5 times a year, I lose audio. The problem is that, for some reason, the Mute box, under the Wave heading gets checked (Control Panel, Sounds and Audio Devices Properties, Audio tab, Volume tab, Play Control, Options, Wave). I cannot figure out why this occu...
  5. Un-mute Sounds and Audio Services
    I'm trying to see how Video/Audio works under RDP protocol. When I log in to TS using RDP the Video plays but not the sound. I looked at the policies in place and enabled Audio in RDP, and the Policies Audio tab. There's one place that I can not seem to enable, which is in...

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: TheLearnedOnePosted on 2009-07-13 at 09:47:15ID: 24841538

You might be able to use calls from the winmm.dll, through p/invoke.

Here is some code from my bag-o-tricks that I haven't used in a long time, and is untested.

' Source:
'  Converted from C# code
'  http://csharp-home.com/index/tiki-print_article.php?articleId=134&PHPSESSID=72a4b6031f43a4ec8a61b288669cf9c9
 
Imports System.Math
Imports System.Runtime.InteropServices
 
Public Class AudioMixer
 
	Private Const MMSYSERR_NOERROR As Integer = 0
	Private Const MAXPNAMELEN As Integer = &H20
	Private Const MIXER_LONG_NAME_CHARS As Integer = &H40
	Private Const MIXER_SHORT_NAME_CHARS As Integer = &H10
	Private Const MIXER_GETLINEINFOF_COMPONENTTYPE As Integer = 3
	Private Const MIXER_GETCONTROLDETAILSF_VALUE As Integer = 0
	Private Const MIXER_GETLINECONTROLSF_ONEBYTYPE As Integer = 2
	Private Const MIXER_SETCONTROLDETAILSF_VALUE As Integer = 0
	Private Const MIXERLINE_COMPONENTTYPE_DST_FIRST As Integer = 0
	Private Const MIXERLINE_COMPONENTTYPE_SRC_FIRST As Integer = &H1000
	Private Const MIXERLINE_COMPONENTTYPE_DST_SPEAKERS As Integer = (MIXERLINE_COMPONENTTYPE_DST_FIRST + 4)
	Private Const MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE As Integer = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 3)
	Private Const MIXERLINE_COMPONENTTYPE_SRC_LINE As Integer = (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 2)
	Private Const MIXERCONTROL_CT_CLASS_FADER As Integer = &H50000000
	Private Const MIXERCONTROL_CT_UNITS_UNSIGNED As Integer = &H30000
	Private Const MIXERCONTROL_CONTROLTYPE_FADER As Integer = (MIXERCONTROL_CT_CLASS_FADER Or MIXERCONTROL_CT_UNITS_UNSIGNED)
	Private Const MIXERCONTROL_CONTROLTYPE_VOLUME As Integer = (MIXERCONTROL_CONTROLTYPE_FADER + 1)
 
	<DllImport("winmm.dll", CharSet:=CharSet.Ansi)> _
	Private Shared Function mixerClose(ByVal hmx As Integer) As Integer
	End Function
 
	<DllImport("winmm.dll", CharSet:=CharSet.Ansi)> _
	Private Shared Function mixerGetControlDetailsA(ByVal hmxobj As Integer, ByRef pmxcd As MIXERCONTROLDETAILS, ByVal fdwDetails As Integer) As Integer
	End Function
 
	<DllImport("winmm.dll", CharSet:=CharSet.Ansi)> _
	Private Shared Function mixerGetID(ByVal hmxobj As Integer, ByVal pumxID As Integer, ByVal fdwId As Integer) As Integer
	End Function
 
	<DllImport("winmm.dll", CharSet:=CharSet.Ansi)> _
	Private Shared Function mixerGetLineControlsA(ByVal hmxobj As Integer, ByRef pmxlc As MIXERLINECONTROLS, ByVal fdwControls As Integer) As Integer
	End Function
 
	<DllImport("winmm.dll", CharSet:=CharSet.Ansi)> _
	Private Shared Function mixerGetLineInfoA(ByVal hmxobj As Integer, ByRef pmxl As MIXERLINE, ByVal fdwInfo As Integer) As Integer
	End Function
 
	<DllImport("winmm.dll", CharSet:=CharSet.Ansi)> _
	Private Shared Function mixerGetNumDevs() As Integer
	End Function
 
	<DllImport("winmm.dll", CharSet:=CharSet.Ansi)> _
	Private Shared Function mixerMessage(ByVal hmx As Integer, ByVal uMsg As Integer, ByVal dwParam1 As Integer, ByVal dwParam2 As Integer) As Integer
	End Function
 
	<DllImport("winmm.dll", CharSet:=CharSet.Ansi)> _
	Private Shared Function mixerOpen(ByRef phmx As Integer, ByVal uMxId As Integer, ByVal dwCallback As Integer, ByVal dwInstance As Integer, ByVal fdwOpen As Integer) As Integer
	End Function
 
	<DllImport("winmm.dll", CharSet:=CharSet.Ansi)> _
	Private Shared Function mixerSetControlDetails(ByVal hmxobj As Integer, ByRef pmxcd As MIXERCONTROLDETAILS, ByVal fdwDetails As Integer) As Integer
	End Function
 
	<StructLayout(LayoutKind.Sequential)> _
	Private Structure MIXERCONTROL
		Public cbStruct As Integer
		Public dwControlID As Integer
		Public dwControlType As Integer
		Public fdwControl As Integer
		Public cMultipleItems As Integer
		<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MIXER_SHORT_NAME_CHARS)> _
		Public szShortName As String
		<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MIXER_LONG_NAME_CHARS)> _
		Public szName As String
		Public lMinimum As Integer
		Public lMaximum As Integer
		<MarshalAs(UnmanagedType.U4, SizeConst:=10)> _
		Public reserved As Integer
	End Structure
 
	Private Structure MIXERCONTROLDETAILS
		Public cbStruct As Integer
		Public dwControlID As Integer
		Public cChannels As Integer
		Public item As Integer
		Public cbDetails As Integer
		Public paDetails As IntPtr
	End Structure
 
	Private Structure MIXERCONTROLDETAILS_UNSIGNED
		Public dwValue As Integer
	End Structure
 
	Private Structure MIXERLINE
		Public cbStruct As Integer
		Public dwDestination As Integer
		Public dwSource As Integer
		Public dwLineID As Integer
		Public fdwLine As Integer
		Public dwUser As Integer
		Public dwComponentType As Integer
		Public cChannels As Integer
		Public cConnections As Integer
		Public cControls As Integer
		<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MIXER_SHORT_NAME_CHARS)> _
		Public szShortName As String
		<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MIXER_LONG_NAME_CHARS)> _
		Public szName As String
		Public dwType As Integer
		Public dwDeviceID As Integer
		Public wMid As Integer
		Public wPid As Integer
		Public vDriverVersion As Integer
		<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=MAXPNAMELEN)> _
		Public szPname As String
	End Structure
 
	Private Structure MIXERLINECONTROLS
		Public cbStruct As Integer
		Public dwLineID As Integer
		Public dwControl As Integer
		Public cControls As Integer
		Public cbmxctrl As Integer
		Public pamxctrl As IntPtr
	End Structure
 
#Region "Public Members"
 
    Public Shared Function GetVolume() As Integer
 
        Dim volCtrl As MIXERCONTROL = New MIXERCONTROL
        Dim currentVol As Integer
        Dim mixer As Integer
 
        mixerOpen(mixer, 0, 0, 0, 0)
 
        Dim type As Integer = MIXERCONTROL_CONTROLTYPE_VOLUME
 
        GetVolumeControl(mixer, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, type, volCtrl, currentVol)
 
        mixerClose(mixer)
 
        Return currentVol
 
    End Function
 
	Public Shared Sub SetVolume(ByVal vVolume As Integer)
 
		Dim volCtrl As MIXERCONTROL = New MIXERCONTROL
		Dim mixer As Integer
		Dim currentVol As Integer
 
		mixerOpen(mixer, 0, 0, 0, 0)
 
		Dim type As Integer = MIXERCONTROL_CONTROLTYPE_VOLUME
		GetVolumeControl(mixer, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, type, volCtrl, currentVol)
		vVolume = Min(vVolume, volCtrl.lMaximum)
		vVolume = Max(vVolume, volCtrl.lMinimum)
		SetVolumeControl(mixer, volCtrl, vVolume)
		GetVolumeControl(mixer, MIXERLINE_COMPONENTTYPE_DST_SPEAKERS, type, volCtrl, currentVol)
		If Not (vVolume = currentVol) Then
			Throw New Exception("Cannot Set Volume")
		End If
		mixerClose(mixer)
    End Sub
 
#End Region
 
#Region "Private Members"
 
    Private Shared Function GetVolumeControl(ByVal hMixer As Integer, ByVal componentType As Integer, ByVal ctrlType As Integer, ByRef mxc As MIXERCONTROL, ByRef vCurrentVol As Integer) As Boolean
 
        Dim mxlc As MIXERLINECONTROLS = New MIXERLINECONTROLS
        Dim mxl As MIXERLINE = New MIXERLINE
        Dim pmxcd As MIXERCONTROLDETAILS = New MIXERCONTROLDETAILS
        Dim du As MIXERCONTROLDETAILS_UNSIGNED = New MIXERCONTROLDETAILS_UNSIGNED
 
        mxc = New MIXERCONTROL
 
        Dim retValue As Boolean
 
        vCurrentVol = -1
 
        mxl.cbStruct = Marshal.SizeOf(mxl)
        mxl.dwComponentType = componentType
 
        Dim rc As Integer = mixerGetLineInfoA(hMixer, mxl, MIXER_GETLINEINFOF_COMPONENTTYPE)
        If rc = MMSYSERR_NOERROR Then
            Dim sizeofMIXERCONTROL As Integer = 152
            Dim ctrl As Integer = Marshal.SizeOf(GetType(MIXERCONTROL))
 
            mxlc.pamxctrl = Marshal.AllocCoTaskMem(sizeofMIXERCONTROL)
            mxlc.cbStruct = Marshal.SizeOf(mxlc)
            mxlc.dwLineID = mxl.dwLineID
            mxlc.dwControl = ctrlType
            mxlc.cControls = 1
            mxlc.cbmxctrl = sizeofMIXERCONTROL
            mxc.cbStruct = sizeofMIXERCONTROL
            rc = mixerGetLineControlsA(hMixer, mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE)
            If rc = MMSYSERR_NOERROR Then
                retValue = True
                mxc = CType(Marshal.PtrToStructure(mxlc.pamxctrl, GetType(MIXERCONTROL)), MIXERCONTROL)
            Else
                retValue = False
            End If
 
            Dim sizeofMIXERCONTROLDETAILS As Integer = Marshal.SizeOf(GetType(MIXERCONTROLDETAILS))
            Dim sizeofMIXERCONTROLDETAILS_UNSIGNED As Integer = Marshal.SizeOf(GetType(MIXERCONTROLDETAILS_UNSIGNED))
 
            pmxcd.cbStruct = sizeofMIXERCONTROLDETAILS
            pmxcd.dwControlID = mxc.dwControlID
            pmxcd.paDetails = Marshal.AllocCoTaskMem(sizeofMIXERCONTROLDETAILS_UNSIGNED)
            pmxcd.cChannels = 1
            pmxcd.item = 0
            pmxcd.cbDetails = sizeofMIXERCONTROLDETAILS_UNSIGNED
 
            rc = mixerGetControlDetailsA(hMixer, pmxcd, MIXER_GETCONTROLDETAILSF_VALUE)
 
            du = CType(Marshal.PtrToStructure(pmxcd.paDetails, GetType(MIXERCONTROLDETAILS_UNSIGNED)), MIXERCONTROLDETAILS_UNSIGNED)
 
            vCurrentVol = du.dwValue
 
            Return retValue
 
        End If
 
        retValue = False
 
        Return retValue
 
    End Function
 
    Private Shared Function SetVolumeControl(ByVal hMixer As Integer, ByVal mxc As MIXERCONTROL, ByVal volume As Integer) As Boolean
 
        Dim retValue As Boolean
        Dim rc As Integer
        Dim mxcd As MIXERCONTROLDETAILS = New MIXERCONTROLDETAILS
        Dim vol As MIXERCONTROLDETAILS_UNSIGNED = New MIXERCONTROLDETAILS_UNSIGNED
 
        mxcd.item = 0
        mxcd.dwControlID = mxc.dwControlID
        mxcd.cbStruct = Marshal.SizeOf(mxcd)
        mxcd.cbDetails = Marshal.SizeOf(vol)
        mxcd.cChannels = 1
 
        vol.dwValue = volume
 
        mxcd.paDetails = Marshal.AllocCoTaskMem(Marshal.SizeOf(GetType(MIXERCONTROLDETAILS_UNSIGNED)))
 
        Marshal.StructureToPtr(vol, mxcd.paDetails, False)
 
        rc = mixerSetControlDetails(hMixer, mxcd, MIXER_SETCONTROLDETAILSF_VALUE)
        If rc = MMSYSERR_NOERROR Then
            retValue = True
        Else
            retValue = False
        End If
 
        Return retValue
 
    End Function
 
#End Region
 
End Class

                                              
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
218:
219:
220:
221:
222:
223:
224:
225:
226:
227:
228:
229:
230:
231:
232:
233:
234:
235:
236:
237:
238:
239:
240:
241:
242:
243:
244:
245:
246:
247:
248:
249:
250:
251:
252:
253:
254:
255:
256:
257:
258:
259:
260:
261:
262:
263:
264:
265:

Select allOpen in new window

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...