【C/C++】以VS2019演示如何在程序中设置自己的提示音[WindowsAPI]
相信很多小伙伴在课程设计大作业的时候都想要另辟蹊径,剑走偏锋,阿巴阿巴。。。来让自己的程序在功能上保证保量的同时可以多点锦上添花的东西(比如我就是那位小伙伴 )。今天和大家分享一个简单的方法让自己的程序能够发出我们自己预设好的提示音。
注:1.本文章内容并非改变系统提示音。
2.本文章较为基础,废话较多,觉得啰嗦的可在最下面直接看代码
首先我们要找到自己想要的素材(因为做提示音,所以不建议太长)我这里用的是郭老师经典的一句“耶斯莫拉”(郭语永远年轻!)然后放到我们对应项目的文件夹。
(当然,放到其他文件夹也可以,这么做是为了接下来的操作中直接使用相对路径,较为简单)
下面是我们需要用到的头文件
#include<windows.h>
#include<mmsystem.h>//多媒体设备接口
#pragma comment(lib,"winmm.lib")//加载静态库
需要注意的是这三句都是预编译指令,千万不要欠手手把 ‘;’ 打进去了。
为了实现功能我们主要会用到这个函数:
MCIERROR mciSendString(LPCSTR lpszCommand , LPTSTR lpszReturnString ,UINT cchReturn , HANDLE hwndCallback );
关于这个函数的机理放在下面了,需要的自取 当然不看也无所谓,会用就行
说白了就是,函数第一个参数是一个操作加上文件的存储地址及文件名(需要带文件后缀,一般为MP3,WAV。这里用的相对路径),后面三个填0就行,简单粗暴无脑。
具体操作可以看下面的代码:
//播放提示音
void cueTone()
{
/*第一个参数为一条string,后三个参数均为0即可*/
/*文件位置及文件名./ysml.WAV*/
mciSendString("close ./ysml.WAV", 0, 0, 0); //关闭
mciSendString("open ./ysml.WAV", 0, 0, 0); //打开
mciSendString("play ./ysml.WAV", 0, 0, 0); //播放
}
有了这个函数,当我们调用它的时候,就可以播放我们自己的提示音了。
当然,有的小伙伴可能会疑惑:为什么顺序是 1.关闭 2.打开 3.播放 ,而不是这样
/*错误示范*/
void cueTone1()
{
/*第一个参数为一条string,后三个参数均为0即可*/
mciSendString("open ./ysml.WAV", 0, 0, 0); //打开
mciSendString("play ./ysml.WAV", 0, 0, 0); //播放
mciSendString("close ./ysml.WAV", 0, 0, 0); //关闭
}
当我们按照 打开、播放、关闭 的方式进行时,我们的函数执行过快,没有听到就会被关闭。
有的同学可能想用Sleep();
函数:
void cueTone2()
{
/*第一个参数为一条string,后三个参数均为0即可*/
mciSendString("open ./ysml.WAV", 0, 0, 0); //打开
mciSendString("play ./ysml.WAV", 0, 0, 0); //播放
Sleep(1000); //等待音频结束
mciSendString("close ./ysml.WAV", 0, 0, 0); //关闭
}
这么做也很不错,但是暂停的同时我们也同样不能进行其他操作。
可能有的小伙伴会想,那我直接用这样的代码:
/*错误示范*/
void cueTone3()
{
/*第一个参数为一条string,后三个参数均为0即可*/
mciSendString("open ./ysml.WAV", 0, 0, 0); //打开
mciSendString("play ./ysml.WAV", 0, 0, 0); //播放
}
这样做没有关闭,好像也没什么。但是实际操作会发现,这样做之后文件只能播放一次,再次使用将不再播放。
所以我个人比较推荐第一个方式的,当然有更好的方法也欢迎在评论区留言。
写好了功能,我们还是在main函数里调用一下试试吧。但是这里依然存在一个问题:
有的小伙伴完全按照第一个函数写,但他们的代码可能会这样
这种情况是因为你是用的是Unicode字符集,可以通过下图方式更改:
更改为多字节字符之后报错就会消失啦!
下面附上一个小程序,通过一个简单的循环,只要输入数字并回车,就可以听见郭子的“耶斯莫拉”了。
#include<stdio.h>
#include<windows.h>
#include<mmsystem.h>//多媒体设备接口
#pragma comment(lib,"winmm.lib")//加载静态库
//播放提示音
void cueTone()
{
mciSendString("close ./ysml.WAV", 0, 0, 0);
mciSendString("open ./ysml.WAV", 0, 0, 0);
mciSendString("play ./ysml.WAV", 0, 0, 0);
}
int main(void)
{
int i;
printf("请输入数字:\n");
while (1)
{
scanf_s("%d",&i);
cueTone();
}
return 0;
}