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

首頁 > 編程 > C++ > 正文

使用C語言編寫鋼琴小程序

2020-05-23 13:32:23
字體:
來源:轉載
供稿:網友

網上搜索鍵盤鋼琴,可以搜索到不少小游戲,最常玩的就是Flash小游戲,26個按鍵的。

后來想用C語言自己實現一個,沒有界面~~控制臺的。

原理很簡單,先在控制臺中獲取按鍵事件,在按鍵事件中,開一個線程,這個線程就是專門用來播放鍵對應的音效mp3的。

為什么要用線程呢,因為直接按鍵播放的話,如果不把mp3播放完,就無法再播放同一mp3,用線程就沒有這個問題了。

線程函數中,就是使用mciSendString函數,打開然后播放對應的mp3文件。

剛開始寫完的時候很哈皮,可以彈奏了,從網上找了一些曲譜,彈的很開心,后來發現一個問題:

彈了一段時間后,再按鍵就沒有聲音了,幾經周折,找到了問題的解決辦法,在線程函數中,播放mp3后,Sleep一段時間,然后Close它。

因為每個key音都是3秒,所以Sleep時間就定為3000。

下面是代碼:

#include <stdio.h> #include <process.h> #include <windows.h> #include <Mmsystem.h> #pragma comment ( lib, "Winmm.lib" )  /* * 隱藏控制臺光標 */ 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};   /*打開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秒后關閉*/  Sleep(3000);  sprintf(sz_command, "close %s", sz_cur_play);  mciSendString(sz_command, 0, 0, 0);   return 0; }  main() {  /*標準輸入句柄*/  HWND h_console_in;    /*輸入記錄*/  INPUT_RECORD input_rec;  DWORD res;   /*線程句柄*/  HANDLE h_thread_play = INVALID_HANDLE_VALUE;  unsigned id_thread_play;   printf("歡迎來到鍵盤鋼琴!!/n/n");   HideTheCursor();    /*獲取標準輸入句柄,并設置為接受輸入*/  h_console_in = GetStdHandle(STD_INPUT_HANDLE);  SetConsoleMode(h_console_in, ENABLE_WINDOW_INPUT | ENABLE_MOUSE_INPUT);   while (1)  {   /*讀取一個輸入*/   ReadConsoleInput(h_console_in, &input_rec, 1, &res);      /*刷新輸入緩沖區*/   FlushConsoleInputBuffer(h_console_in);      /*輸入事件為按鍵輸入,且按鍵按下時*/   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')    {     /*將當前按鍵作為參數,開線程*/     h_thread_play = (HANDLE)_beginthreadex(NULL, 0, &thread_play,      (void *)input_rec.Event.KeyEvent.wVirtualKeyCode, 0, &id_thread_play);    }   }  } }

 以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 通城县| 上犹县| 泾川县| 漠河县| 吉首市| 静安区| 措勤县| 泗洪县| 丰都县| 青河县| 沽源县| 宽甸| 墨脱县| 环江| 台前县| 铅山县| 吉安县| 连南| 桦南县| 唐河县| 高平市| 德阳市| 泗水县| 青龙| 穆棱市| 富裕县| 金乡县| 阆中市| 南安市| 仪征市| 白银市| 石嘴山市| 常州市| 渭南市| 汶川县| 乐都县| 昌平区| 孝昌县| 永康市| 娄底市| 邳州市|