基于C++編寫一個(gè)鍵盤提示音程序
首先講一下思路,這次制作的小黑子相當(dāng)于鍵盤提示音,輸入J,N,T,M,會(huì)發(fā)出“雞你太美”的聲音,連續(xù)按下JNTM則會(huì)發(fā)出“你干嘛啊,哎呦”的聲音。
完整的工程和代碼以及成品已經(jīng)上傳至百度網(wǎng)盤,喜歡的同學(xué)可以下載:
鏈接:https://pan.baidu.com/s/1IjPBB1dhz-ZPSP8SpKWq8Q 提取碼: 5smw
準(zhǔn)備資源
首先我們要下載雞你太美的音頻并剪輯好,然后再準(zhǔn)備一個(gè)可愛的圖片當(dāng)作圖標(biāo)。我已經(jīng)準(zhǔn)備好了一份,想要的同學(xué)可以直接用。
將準(zhǔn)備好的資源添加到工程中。

之后不要忘記在主程序引用資源文件
#include "resource.h"
播放聲音
使用PlaySound函數(shù)即可
PlaySound((LPCTSTR)IDR_WAVE1, NULL, SND_RESOURCE | SND_SYNC);
獲取鍵盤按鍵
使用GetAsyncKeyState獲取鍵盤按鍵狀態(tài)。為了方便使用,我使用了宏定義
#define KEY_DOWN(key_name) ((GetAsyncKeyState(key_name)& 0x8001)?1:0) #define KEY_UP(key_name) ((GetAsyncKeyState(key_name)& 0x8001)?0:1)
然后就是獲取鍵盤輸入了
for (;;)
{
//雞
if (KEY_DOWN('J')) {
if (hasPress[0] == false)
{
hasPress[0] = true;
niganma = 1;
thread t1(PlaySounds,0);
t1.detach();
}
}
if (KEY_UP('J'))
{
hasPress[0] = false;
}
//你
if (KEY_DOWN('N')) {
if (hasPress[1] == false)
{
hasPress[1] = true;
if (niganma == 1)
{
niganma = 2;
}
else
{
niganma = 0;
}
thread t1(PlaySounds, 1);
t1.detach();
}
}
if (KEY_UP('N'))
{
hasPress[1] = false;
}
//太
if (KEY_DOWN('T')) {
if (hasPress[2] == false)
{
hasPress[2] = true;
if (niganma == 2)
{
niganma = 3;
}
else
{
niganma = 0;
}
thread t1(PlaySounds, 2);
t1.detach();
}
}
if (KEY_UP('T'))
{
hasPress[2] = false;
}
//美
if (KEY_DOWN('M')) {
if (hasPress[3] == false)
{
hasPress[3] = true;
if (niganma == 3)
{
thread t1(PlaySounds, 4);
t1.detach();
niganma = 0;
}
else {
thread t1(PlaySounds, 3);
t1.detach();
}
}
}
if (KEY_UP('M'))
{
hasPress[3] = false;
}
}完整代碼
所以,完整的代碼如下:
// XiaoHeiZi.cpp : 此文件包含 "main" 函數(shù)。程序執(zhí)行將在此處開始并結(jié)束。
//
#include "resource.h"
#include <iostream>
#include<thread>
#include <conio.h>
#include<stdlib.h>
#include<windows.h>
#include<iostream>
#include <Mmsystem.h>
#pragma comment(lib, "Winmm.lib")
#define KEY_DOWN(key_name) ((GetAsyncKeyState(key_name)& 0x8001)?1:0)
#define KEY_UP(key_name) ((GetAsyncKeyState(key_name)& 0x8001)?0:1)
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
using namespace std;
bool ModifyRegedit(bool bAutoRun)
{
char pFileName[MAX_PATH] = { 0 };
DWORD dwRet = GetModuleFileNameA(NULL, (LPSTR)pFileName, MAX_PATH);
std::cout << pFileName;
HKEY hKey;
LPCSTR lpRun = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run";
long lRet = RegOpenKeyExA(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);
if (lRet != ERROR_SUCCESS)
{
std::cout << "failed";
return false;
}
if (bAutoRun)
RegSetValueA(hKey, "XiaoHeizi", (DWORD)REG_SZ, (LPCSTR)pFileName, MAX_PATH);
else
RegDeleteValueA(hKey, "XiaoHeizi");
RegCloseKey(hKey);
return true;
}
static void PlaySounds(int i)
{
if (i == 0)
{
PlaySound((LPCTSTR)IDR_WAVE1, NULL, SND_RESOURCE | SND_SYNC);
}
else if (i == 1)
{
PlaySound((LPCTSTR)IDR_WAVE4, NULL, SND_RESOURCE | SND_SYNC);
}
else if (i == 2)
{
PlaySound((LPCTSTR)IDR_WAVE5, NULL, SND_RESOURCE | SND_SYNC);
}
else if (i == 3)
{
PlaySound((LPCTSTR)IDR_WAVE3, NULL, SND_RESOURCE | SND_SYNC);
}
else
{
PlaySound((LPCTSTR)IDR_WAVE2, NULL, SND_RESOURCE | SND_SYNC);
}
}
int main()
{
ModifyRegedit(true);
bool hasPress[4];
for (int i = 0; i < 4; i++) {
hasPress[i] = false;
}
int niganma = 0;
for (;;)
{
//雞
if (KEY_DOWN('J')) {
if (hasPress[0] == false)
{
hasPress[0] = true;
niganma = 1;
thread t1(PlaySounds,0);
t1.detach();
}
}
if (KEY_UP('J'))
{
hasPress[0] = false;
}
//你
if (KEY_DOWN('N')) {
if (hasPress[1] == false)
{
hasPress[1] = true;
if (niganma == 1)
{
niganma = 2;
}
else
{
niganma = 0;
}
thread t1(PlaySounds, 1);
t1.detach();
}
}
if (KEY_UP('N'))
{
hasPress[1] = false;
}
//太
if (KEY_DOWN('T')) {
if (hasPress[2] == false)
{
hasPress[2] = true;
if (niganma == 2)
{
niganma = 3;
}
else
{
niganma = 0;
}
thread t1(PlaySounds, 2);
t1.detach();
}
}
if (KEY_UP('T'))
{
hasPress[2] = false;
}
//美
if (KEY_DOWN('M')) {
if (hasPress[3] == false)
{
hasPress[3] = true;
if (niganma == 3)
{
thread t1(PlaySounds, 4);
t1.detach();
niganma = 0;
}
else {
thread t1(PlaySounds, 3);
t1.detach();
}
}
}
if (KEY_UP('M'))
{
hasPress[3] = false;
}
}
}以上就是基于C++編寫一個(gè)鍵盤提示音程序的詳細(xì)內(nèi)容,更多關(guān)于C++鍵盤提示音程序的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語言函數(shù)的遞歸和調(diào)用實(shí)例分析
一個(gè)函數(shù)在它的函數(shù)體內(nèi)調(diào)用它自身稱為遞歸調(diào)用。這種函數(shù)稱為遞歸函數(shù)。C語言允許函數(shù)的遞歸調(diào)用。在遞歸調(diào)用中,主調(diào)函數(shù)又是被調(diào)函數(shù)。執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身,每調(diào)用一次就進(jìn)入新的一層2013-07-07
基于QT實(shí)現(xiàn)自定義溫度計(jì)的示例代碼
QT原生控件沒有實(shí)現(xiàn)如儀表盤或者溫度計(jì)的控件,只好自己實(shí)現(xiàn),所以本文為大家介紹了如何利用qt實(shí)現(xiàn)自定義溫度/濕度控件,感興趣的小伙伴可以了解下2023-11-11
詳解C語言求兩個(gè)數(shù)的最大公約數(shù)及最小公倍數(shù)的方法
這篇文章主要介紹了C語言求兩個(gè)數(shù)的最大公約數(shù)及最小公倍數(shù)的方法,輾轉(zhuǎn)相除法和輾轉(zhuǎn)相減法在解決這種問題時(shí)最常用到,需要的朋友可以參考下2016-03-03
C++實(shí)現(xiàn)讀取特定路徑下文件夾及文件名的方法
這篇文章主要介紹了C++實(shí)現(xiàn)讀取特定路徑下文件夾及文件名的方法,需要的朋友可以參考下2014-07-07

