国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > C > 正文

使用C語(yǔ)言編寫(xiě)鋼琴小程序

2020-01-26 13:46:11
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

網(wǎng)上搜索鍵盤(pán)鋼琴,可以搜索到不少小游戲,最常玩的就是Flash小游戲,26個(gè)按鍵的。

后來(lái)想用C語(yǔ)言自己實(shí)現(xiàn)一個(gè),沒(méi)有界面~~控制臺(tái)的。

原理很簡(jiǎn)單,先在控制臺(tái)中獲取按鍵事件,在按鍵事件中,開(kāi)一個(gè)線程,這個(gè)線程就是專門(mén)用來(lái)播放鍵對(duì)應(yīng)的音效mp3的。

為什么要用線程呢,因?yàn)橹苯影存I播放的話,如果不把mp3播放完,就無(wú)法再播放同一mp3,用線程就沒(méi)有這個(gè)問(wèn)題了。

線程函數(shù)中,就是使用mciSendString函數(shù),打開(kāi)然后播放對(duì)應(yīng)的mp3文件。

剛開(kāi)始寫(xiě)完的時(shí)候很哈皮,可以彈奏了,從網(wǎng)上找了一些曲譜,彈的很開(kāi)心,后來(lái)發(fā)現(xiàn)一個(gè)問(wèn)題:

彈了一段時(shí)間后,再按鍵就沒(méi)有聲音了,幾經(jīng)周折,找到了問(wèn)題的解決辦法,在線程函數(shù)中,播放mp3后,Sleep一段時(shí)間,然后Close它。

因?yàn)槊總€(gè)key音都是3秒,所以Sleep時(shí)間就定為3000。

下面是代碼:

#include <stdio.h> #include <process.h> #include <windows.h> #include <Mmsystem.h> #pragma comment ( lib, "Winmm.lib" )  /* * 隱藏控制臺(tái)光標(biāo) */ void HideTheCursor() {  CONSOLE_CURSOR_INFO cciCursor;  HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);    if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {   cciCursor.bVisible = FALSE;   SetConsoleCursorInfo(hStdOut, &cciCursor);  } }  /* * 播放線程 */ unsigned _stdcall thread_play(LPVOID lpParam) {  char sz_command[126] = {0};  char sz_cur_play[32] = {0};   /*打開(kāi)mp3文件*/  sprintf(sz_command, "open /"key//%c.mp3/" alias key_%c", (WORD)lpParam, (WORD)lpParam);  mciSendString(sz_command, 0, 0, 0 );   sprintf(sz_cur_play, "key_%c", (WORD)lpParam);   /*播放*/  sprintf(sz_command, "play %s", sz_cur_play);  mciSendString(sz_command, 0, 0, 0 );    /*3秒后關(guān)閉*/  Sleep(3000);  sprintf(sz_command, "close %s", sz_cur_play);  mciSendString(sz_command, 0, 0, 0);   return 0; }  main() {  /*標(biāo)準(zhǔn)輸入句柄*/  HWND h_console_in;    /*輸入記錄*/  INPUT_RECORD input_rec;  DWORD res;   /*線程句柄*/  HANDLE h_thread_play = INVALID_HANDLE_VALUE;  unsigned id_thread_play;   printf("歡迎來(lái)到鍵盤(pán)鋼琴!!/n/n");   HideTheCursor();    /*獲取標(biāo)準(zhǔn)輸入句柄,并設(shè)置為接受輸入*/  h_console_in = GetStdHandle(STD_INPUT_HANDLE);  SetConsoleMode(h_console_in, ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT);   while (1)  {   /*讀取一個(gè)輸入*/   ReadConsoleInput(h_console_in, &input_rec, 1, &res);      /*刷新輸入緩沖區(qū)*/   FlushConsoleInputBuffer(h_console_in);      /*輸入事件為按鍵輸入,且按鍵按下時(shí)*/   if (input_rec.EventType == KEY_EVENT && input_rec.Event.KeyEvent.bKeyDown == TRUE)   {    /*輸入的是A-Z之間的按鍵*/    if (input_rec.Event.KeyEvent.wVirtualKeyCode >= 'A'     && input_rec.Event.KeyEvent.wVirtualKeyCode <= 'Z')    {     /*將當(dāng)前按鍵作為參數(shù),開(kāi)線程*/     h_thread_play = (HANDLE)_beginthreadex(NULL, 0, &thread_play,      (void *)input_rec.Event.KeyEvent.wVirtualKeyCode, 0, &id_thread_play);    }   }  } }

 以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 道真| 巴林左旗| 崇信县| 铜陵市| 阳城县| 英山县| 长汀县| 苏尼特左旗| 内江市| 泰宁县| 延边| 开封县| 阜新市| 阳春市| 晋江市| 青川县| 南皮县| 西林县| 昌吉市| 鸡西市| 绵阳市| 崇州市| 保亭| 轮台县| 南充市| 肥西县| 遂川县| 扎鲁特旗| 渭源县| 临沂市| 武清区| 石河子市| 衡水市| 五河县| 抚州市| 兴国县| 万安县| 灯塔市| 渝北区| 长汀县| 鹿泉市|