91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-09-05 01:15:17 來源:腳本之家 閱讀:235 作者:為了小豆丁我要好好鍛煉 欄目:編程語言

網上搜索鍵盤鋼琴,可以搜索到不少小游戲,最常玩的就是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); 
   } 
  } 
 } 
}

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

麟游县| 周至县| 日土县| 霍城县| 长子县| 桃源县| 东明县| 苏尼特右旗| 德昌县| 和平区| 龙江县| 新郑市| 成武县| 双峰县| 韶关市| 临湘市| 宁都县| 宝应县| 罗源县| 万州区| 柘荣县| 纳雍县| 织金县| 加查县| 新丰县| 金寨县| 汾西县| 松桃| 遂溪县| 松原市| 清苑县| 亚东县| 沂源县| 沙雅县| 梁山县| 蒙阴县| 屯留县| 高唐县| 荔波县| 岐山县| 阳城县|