如何在 .Net 中播放“新邮件”系统声音?
Posted
技术标签:
【中文标题】如何在 .Net 中播放“新邮件”系统声音?【英文标题】:How do I play the "New Mail" system sound in .Net? 【发布时间】:2009-03-29 19:52:17 【问题描述】:如何在 C# 中播放“新邮件”系统声音?这也称为“通知”声音。
在 Win32 中,类似于
sndPlaySound('Notify', (SND_ALIAS or SND_ASYNC));
那么您如何在 .Net 中做到这一点?我知道你可以做到
System.Media.SystemSounds.Asterisk.Play();
但是那里只有非常有限的五种声音 - 不包括用户设置为新邮件声音的任何声音。
当我收到新邮件并播放该文件时,我可以找出正在播放的 .wav 文件,但当用户的声音方案更改时,该文件不会更新。
我最终做了什么:
我没有播放系统声音,而是将 wav 文件作为资源嵌入到应用程序中,并使用System.Media.SoundPlayer
播放它
【问题讨论】:
【参考方案1】:一种选择是直接 PInvoke 到 sndSound API。这是该方法的 PInvoke 定义
public partial class NativeMethods
/// Return Type: BOOL->int
///pszSound: LPCWSTR->WCHAR*
///fuSound: UINT->unsigned int
[System.Runtime.InteropServices.DllImportAttribute("winmm.dll", EntryPoint="sndPlaySoundW")]
[return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
public static extern bool sndPlaySoundW([System.Runtime.InteropServices.InAttribute()] [System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPWStr)] string pszSound, uint fuSound) ;
/// SND_APPLICATION -> 0x0080
public const int SND_APPLICATION = 128;
/// SND_ALIAS_START -> 0
public const int SND_ALIAS_START = 0;
/// SND_RESOURCE -> 0x00040004L
public const int SND_RESOURCE = 262148;
/// SND_FILENAME -> 0x00020000L
public const int SND_FILENAME = 131072;
/// SND_ALIAS_ID -> 0x00110000L
public const int SND_ALIAS_ID = 1114112;
/// SND_NOWAIT -> 0x00002000L
public const int SND_NOWAIT = 8192;
/// SND_NOSTOP -> 0x0010
public const int SND_NOSTOP = 16;
/// SND_MEMORY -> 0x0004
public const int SND_MEMORY = 4;
/// SND_PURGE -> 0x0040
public const int SND_PURGE = 64;
/// SND_ASYNC -> 0x0001
public const int SND_ASYNC = 1;
/// SND_ALIAS -> 0x00010000L
public const int SND_ALIAS = 65536;
/// SND_SYNC -> 0x0000
public const int SND_SYNC = 0;
/// SND_LOOP -> 0x0008
public const int SND_LOOP = 8;
/// SND_NODEFAULT -> 0x0002
public const int SND_NODEFAULT = 2;
【讨论】:
【参考方案2】:实际上新邮件的声音是“MailBeep”别名,而不是“Notify”别名。
所以你想调用 PlaySound(L"MailBeep", NULL, SND_SYSTEM | SND_NODEFAULT | SND_ALIAS);
P/Invoke 绝对是通往这里的路。
Don't forget to specify SND_NODEFAULT or your app will make dings even if the user disables the new mail sound in the control panel.
SND_SYSTEM 是 Windows Vista 的新功能,可将声音作为“Windows 声音”播放 - 是否需要这种体验取决于您。
【讨论】:
SND_SYSTEM的值是多少?以上是关于如何在 .Net 中播放“新邮件”系统声音?的主要内容,如果未能解决你的问题,请参考以下文章