user-0 提问: c语言的小钢琴游戏问题

回复:
user: user-1
content: 为什么该论坛禁止我发超过50字？

user: user-2
content: 引用 9 楼 qq_33758085 的回复:钢琴.exe - 1 error(s), 0 warning(s) 引用 10 楼 qq_33758085 的回复:你编译的效果是怎样的？  可以编译，1 error 是什么，你麻烦发完整啊

user: user-0
content: 你编译的效果是怎样的？

user: user-0
content: 钢琴.exe - 1 error(s), 0 warning(s)

user: user-2
content: 引用 7 楼 qq_33758085 的回复:#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_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() { 	/*输入标准句柄*/ HANDLE 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);    		} 	}  	} }  可以正常编译，你说的错误什么，给出错误提示

user: user-0
content: #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_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() { 	/*输入标准句柄*/ HANDLE 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);    		} 	}  	} }

user: user-2
content: 引用 15 楼 qq_33758085 的回复:可以编译了，但是怎么用呢？  你得自己看代码啊，而且从你代码看，你目录下需要有他需要的几个mp3文件

user: user-3
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  查MSDN是Windows程序员必须掌握的技能之一。

user: user-2
content: 引用 12 楼 qq_33758085 的回复:--------------------Configuration: 钢琴 - Win32 Debug-------------------- Compiling... 钢琴.cpp F:\C语言\钢琴.cpp(81) : error C2065: '_beginthreadex' : undeclared identifier F:\C语言\钢琴.cpp(87) : warning C4508: 'main' : function should return a value; 'void' return type assumed 执行 cl.exe 时出错.  钢琴.exe - 1 error(s), 0 warning(s)  前面加上#include <process.h>

user: user-0
content: 可以编译了，但是怎么用呢？

user: user-0
content: Skipping... (no relevant changes detected)

user: user-0
content: --------------------Configuration: 钢琴 - Win32 Debug-------------------- Compiling... 钢琴.cpp F:\C语言\钢琴.cpp(81) : error C2065: '_beginthreadex' : undeclared identifier F:\C语言\钢琴.cpp(87) : warning C4508: 'main' : function should return a value; 'void' return type assumed 执行 cl.exe 时出错.  钢琴.exe - 1 error(s), 0 warning(s)

user: user-4
content: #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_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; }  void main() { 	/*输入标准句柄*/ 	HANDLE 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); 				} 		} 		 	} }

user: user-2
content: 还有h_console_in的类型应该是HANDLE，而不是HWND

user: user-2
content: 注意大小写，不是 hStdOut ， 而是hstdOut 注意字母l与数字1，不是1pParam，而是lpParam 同理misSendString 拼错了

user: user-5
content: 有意思，多年以前玩过一个DOS下的弹钢琴，好像是有界面的，就是一条一条的类似琴键。忘了是光盘里的还是从哪个同学软盘拷来的，毕业后无聊做了个小游戏下载的静态个人主页（记得好像是51.net的个人主页空间），用56K的猫找遍网络，找不到那个DOS弹钢琴了。因为经历了一些转折，最初玩电脑时的一些美好的小游戏小软件后来又找回来很多，可惜个人主页没有几个月就被关闭无法访问了，还交了3年的钱好像。

user: user-2
content: 引用 4 楼 qq_33758085 的回复:改了还是显示有错，能不能发 验证过 的代码过来？  你把你改好的代码发上来，帮你看下

user: user-0
content: 改了还是显示有错，能不能发 验证过 的代码过来？