内置咔嗒声

时间:2018-06-01 15:13:42

标签: java javasound

Windows内置系统声音如win.sound.exclamationwin.sound.asterisk等。通过内置,我的意思是这些声音已经存在于操作系统上,我不需要依赖提供我的程序的声音文件。

我有访问这些声音的代码(见下文)。

final Runnable runnable = 
(Runnable) Toolkit.getDefaultToolkit().getDesktopProperty("win.sound.start");

很遗憾,我找不到点击的内置系统声音。

我不想下载.wav文件并以编程方式读取文件。是否有系统调用允许我播放操作系统的默认声音以进行单击?

1 个答案:

答案 0 :(得分:1)

  

OP:那么它会像win.sound.windows_navigation_start一样被访问吗?

不....我不相信你可以通过Windows音频反馈属性访问该文件,它似乎没有这种方式可用。在Windows操作系统中可用的所有音频反馈声音中,实际上只有少数支持它们,并且可以与 Toolkit.getDesktopProperty()方法一起使用,这些音频声音属性是:

until p f v = head (dropWhile (not . p) (iterate f v))

如果您想查看Windows系统支持哪些音频反馈声音,请使用以下代码:

win.sound.asterisk
win.sound.close
win.sound.default
win.sound.exclamation
win.sound.exit
win.sound.hand
win.sound.maximize
win.sound.menuCommand
win.sound.menuPopup
win.sound.minimize
win.sound.open
win.sound.question
win.sound.restoreDown
win.sound.restoreUp
win.sound.start

我怀疑你已经知道这一点,我想你已经知道了,因为该属性可用,并不一定意味着当你尝试使用某些时会听到声音(至少不适合所有人)。例如,无论我做什么,使用“win.sound.start”属性都不会给我任何音频反馈。我甚至不确定我知道那个特定的音频反馈是什么。

因此,考虑到上述情况,利用Windows提供的单击声音的唯一方法就是位于 C:\ Windows \ media中的 Windows Navigation Start.wav 文件\ 目录是使用Java的音频类之一。在下面的示例代码中,我们使用 Clip 类以及 AudioInputStream AudioSystem 类,所有这些都来自 javax.sound。采样库。

System.out.println("Supported Windows Audio Property Names");
System.out.println("======================================");
String propnames[] = (String[]) Toolkit.getDefaultToolkit().getDesktopProperty("win.propNames");
for (String propname : propnames) {
    if (propname.startsWith("win.sound.")) {
        System.out.println(propname);
    }
}

并使用此方法:

private void playWav(String soundFilePath) {
    File sFile = new File(soundFilePath);
    if (!sFile.exists()) {
        String ls = System.lineSeparator();
        System.err.println("Can not locate the supplied sound file!" + 
                ls + "(" + soundFilePath + ")" + ls);
        return;
    }
    try {

        Clip clip;
        try (AudioInputStream audioInputStream = AudioSystem.
                getAudioInputStream(sFile.getAbsoluteFile())) {
            clip = AudioSystem.getClip();
            // Rewind clip to beginning. 
            // Not really required in this example!
            // It's just good to know.
            clip.setFramePosition(0); 
            clip.open(audioInputStream);
        }
        clip.start();
    }
    catch (UnsupportedAudioFileException | IOException | LineUnavailableException ex) {
        Logger.getLogger("playWav()").log(Level.SEVERE, null, ex);
    }
}

如果你已经走了这么远,那么你也可以下载并嵌入你自己的Click声音文件而不是依赖于Windows文件。至少这种方式几乎可以在任何平台上运行。