代码之家  ›  专栏  ›  技术社区  ›  Anthony Waqas Raja

如何在.NET中播放“新邮件”系统声音?

  •  4
  • Anthony Waqas Raja  · 技术社区  · 15 年前

    如何在c_中播放“新邮件”系统声音?这也被称为“通知”声音。

    在Win32中,这就像

    sndPlaySound('Notify', (SND_ALIAS or SND_ASYNC));
    

    那么你在.NET中是如何做到的呢?我知道你能做到

    System.Media.SystemSounds.Asterisk.Play();
    

    但是有一组非常有限的五种声音-不包括用户设置为新邮件声音的任何声音。

    当我收到新邮件并播放该文件时,我可以找出正在播放的.wav文件,但当用户的声音方案更改时,该文件不会更新。


    我最终所做的:

    我没有播放系统声音,而是将wav文件作为资源嵌入到应用程序中,并使用 System.Media.SoundPlayer

    2 回复  |  直到 12 年前
        1
  •  5
  •   JaredPar    15 年前

    一个选项是将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
  •  3
  •   Larry Osterman    15 年前

    实际上,新的邮件声音是“mailbeep”别名,而不是“notify”别名。

    所以您要调用playsound(l“mailbeep”,空,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_系统是Windows Vista的新系统,它可以使声音作为“Windows声音”播放-如果你想拥有这样的体验,这取决于你自己。