大家好,我是阿汤哥,上篇文章讲了怎么在命令行能播放音乐。

但是有个问题,那个程序运行起来,只能播放音乐,你不能和程序交互。

今天和大家讲讲,怎么给你的程序添加背景音乐BGM,播放音乐的同时,你也能在命令行打印字符,敲字符,和程序进行互动。

如何添加背景音乐?

这里我们用到Windows系统的多线程接口。什么是多线程,你可能有点蒙圈,说白点,一个线程就是一个工人,可以给你干一件活。通常我们写的程序,一个Main函数,它只有一个主线程,程序顺序执行,一步步地。多线程就是除了主线程这个工人,还可以创建子线程,找来其他工人,同时给你做其他事情。

今天,我们就创建一个子线程,找另一个工人来,来播放背景音乐BGM,只要主程序不退出,背景音乐可以一直放。

一个简单的字符程序游戏:

输入字符'a',打印"A for Apple";

输入字符'b',打印"B for ball";

输入字符'c',打印“C for cat”。

同时,程序运行过程中,播放BGM。

介绍下Windows系统创建线程的关键函数CreateThread:

HANDLE WINAPI CreateThread( _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,

_In_ SIZE_T dwStackSize,

_In_ LPTHREAD_START_ROUTINE lpStartAddress,

_In_opt_ LPVOID lpParameter,

_In_ DWORD dwCreationFlags,

_Out_opt_ LPDWORD lpThreadId );

你可能有点懵,你先不用管它的具体含义,用起来很简单。在主函数里这样调用这个函数,创建线程:

CreateThread(NULL,0,线程函数名,NULL,0,NULL);

另外,线程要执行任务,需要有个对应的函数,先定义一个线程所要执行的函数:

这里,我们不妨命名为:play_bgm_poc。线程函数有他的固定格式,函数头这样写:

DWORD WINAPI play_bgm_poc(LPVOID lpParameter)

函数体里面,写播放音乐的代码。下面附上完整代码。

代码

/**

* 功能: 给程序添加BGM背景音乐

* Author: 阿汤哥

* 微信公众号:C语言修仙

*/

#pragma comment(lib,"Winmm.lib")

#include

#include

#include

#include

#include

#include

#include

#include

int index = 0;

DWORD WINAPI play_bgm_poc(LPVOID lpParameter){

static MCI_OPEN_PARMS mciOpen;

static MCI_PLAY_PARMS mciPlay;

static MCI_DGV_SETAUDIO_PARMS mciSetAudioPara;

//开始播放

mciOpen.lpstrElementName = "D:\\dnxk.mp3";     //可以改成你自己的歌曲目录

mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);

mciSendCommand(mciOpen.wDeviceID, MCI_PLAY, MCI_DGV_PLAY_REPEAT,

(DWORD)&mciPlay);

//设置初始音量

mciSendCommand(mciOpen.wDeviceID, MCI_SETAUDIO, MCI_DGV_SETAUDIO_VALUE |

MCI_DGV_SETAUDIO_ITEM,(DWORD)(LPVOID)&mciSetAudioPara);

printf("Playing BGM\n");

return 0;

}

int main(){

HANDLE hThread1;

hThread1=CreateThread(NULL,0,play_bgm_poc,NULL,0,NULL);

CloseHandle(hThread1);

printf("hello world\n");

char ch;

while(1)

{

ch = getchar();

if (ch == 'a')

printf("A for apple\n\n");

else if (ch == 'b')

printf("B for ball\n\n");

else if (ch == 'c')

printf("C for cat\n\n");

}

return 0;

}

运行效果

见视频:

写在最后

你以后写程序,特别是那种大一点的程序,比如图书管理系统这些,运行时间比较长,短时间不退出的,可以加上背景BGM。

喜欢的话,记得分享和在看。

在c语言程序中添加背景音乐,怎么给你的C语言程序添加BGM背景音乐?相关推荐

  1. 三菱PLC CCD控制ST程序 本PLC程序中CCD控制用的ST结构化语言,程序都有注释

    三菱PLC CCD控制ST程序 本PLC程序中CCD控制用的ST结构化语言,程序都有注释.注释全面,用的三菱fx3u系列plc,可借鉴,本程序已经设备实际批量应用.稳定生产.成熟可靠,借鉴价值高,是三 ...

  2. java项目运行在浏览器_在 Java 程序中,能在 WWW 浏览器上运行的是 程序。_学小易找答案...

    [简答题]已知:如图, AD 是△ ABC 的角平分线, DE//AC, 交 AB 于点 E , DF//AB ,交 AC 于点 F ,求证: AD ⊥ EF. [简答题]Java语言具有较好的安全性 ...

  3. python程序中每条语句以分号结尾,在Python程序中,每条语句末尾必须添加分号。...

    在Python程序中,每条语句末尾必须添加分号. 更多相关问题 组织沟通就是在组织结构环境下的( )的交流过程,它涉及战略控制以及如何在创造力和约束力之间达到平衡. (2019考前训练1)启运港填写_ ...

  4. c语言程序中的注释必须单独占一行,C语言习题第一章

    以下叙述中错误的是() A.一个C语言程序只能有一个主函数 B.C语言编写的每个函数都可以进行独立的编译并执行 C.C语言编写的函数都可以作为一个独立的源程序文件 D.C语言编写的函数源程序,其文件名 ...

  5. c语言规定的主函数名是,C语言源程序中主函数名由系统规定为_______,程序员是不能改变的。...

    _ "指长拳运动中动静快慢等时间节拍处理和掌握的方法"称为 所有者权益类账户有期末余额应在贷方.( ) 嗜热微生物具有耐热的蛋白和酶类 根据物理.化学因素对病毒的影响,试述如何控制 ...

  6. c语言程序中的函数的函数名,一个C语言程序是由一个或多个函数组成的,其中必须包含一个函数,函数名是mian。...

    解析: [解析题]绿茶的茶水比一般是1:50. [解析题]以下程序的输出结果是 ________ . struct HAR { int x;int y;struct HAR *p;}h[2];int ...

  7. 在下面的c语言语句中存在错误的是,在下面的C语言语句中,存在错误的是int a=b=10;...

    C语言选择28下列定义变量的语句中错误的是A.floatUS$;B.doubleint_;C.charFor;D.int c语言中,能用来做标识符的只有字母,数字和下划线_并且标识符开头只能是字母或者 ...

  8. 如何将计算思维融合到C语言程序设计中,利用案例融合计算思维与C语言教学

    摘 要: C语言程序设计的教学目标是使学生利用C语言结合算法解决简单的实际问题.要实现该目标不仅要熟练掌握C语言本身的基本语法和结构,还要具备设计合理算法的思维能力.然而,当前各高校课程教学往往忽略思 ...

  9. c语言关键词中英翻译机编程,课程设计--C语言关键字中英翻译机

    <课程设计--C语言关键字中英翻译机>由会员分享,可在线阅读,更多相关<课程设计--C语言关键字中英翻译机(21页珍藏版)>请在人人文库网上搜索. 1.课课 程程 设设 计计 ...

  10. c语言链表中何时用点何时用箭头,C语言指针五——指针应用:链表

    C语言指针五--指针应用:链表 --从代码猜测作者的意图毕竟是一件痛苦的事,这也是为什么许多人接手别人的项目宁愿从头做起也不愿意使用现有代码的原因. 链表是一种重要的数据结构,它是许多其他数组结构的和 ...

最新文章

  1. java动态加载配置文件
  2. 高可用性网络的简单配置方案(一)
  3. SpringMVC源码之参数解析绑定原理
  4. DBSCAN密度聚类
  5. Bzoj3309-DZY Loves Math【莫比乌斯反演,线性筛】
  6. 14 | 排序优化:如何实现一个通用的、高性能的排序函数?
  7. 当SQL Server爱上Linux:配置 SQL Server 2017 上的可用性组初体验
  8. Chinalinuxpub.com初学版精华
  9. 算法设计与分析复习大纲
  10. 5款好看的WordPress博客主题下载
  11. 如何将PPT进行压缩?PPT压缩的方法是什么
  12. 计算机程序员带什么手表,程序员只爱格子衫?这些手表程序员也喜欢!
  13. 【NLP】《Chinese Poetry Generation with Planning based Neural Network》的阅读笔记
  14. mybatis报错:Error evaluating expression
  15. uni-app修改代码,微信开发者工具不更新
  16. 基于IMX6Q的uboot启动流程分析(3):_main函数之relocate_code与board_init_r
  17. java Lambda与stream
  18. 绿色版MySQL安装教程
  19. IoT技术概览(postscapes)
  20. windows下如何查看端口列表以及如何开放指定端口

热门文章

  1. 文华财经基本函数及语法
  2. 【论文解读 AAAI 2020】Graph-Based Reasoning over Heterogeneous External Knowledge for 常识问答
  3. P1571 眼红的Medusa
  4. 【管理经验】管理的本质-激发善意
  5. unity 纹理压缩格式‘_游戏制作行业为什么使用TGA格式的贴图而不使用PNG格式?...
  6. shader篇-渲染纹理
  7. Android Kernel wakeup_sources分析
  8. bootstrap-modal 模态框显示一下又消失问题解决以及模态框的基本使用方法
  9. PTA Python习题 找钱
  10. 聚合数据iOS SDK 12306火车票查询订票演示示例