1.功能需求

开发一个基于键盘和主机扬声器(小喇叭)的简易电子琴工具,同时它也可以自动的演奏指定的简谱文件。

 

通过调用计算机系统的API接口,导入kernel32.dll,调用相关的方法,开发基于键盘和扬声器的一个简易电子琴工具。主要是为了了解计算机操作系统中的相关API的知识,学会对API基本应用。

 

 

2.实验原理

引入[DllImport("kernel32.dll")]和[DllImport("winmm.dll")]。通过设置音频和时间间隔来播放声音。

[DllImport("kernel32.dll")]:是Windows 9x/Me中非常重要的32位动态链接库文件,属于内核级文件。它控制着系统的内存管理、数据的输入输出操作和中断处理,当Windows启动时,kernel32.dll就驻留在内存中特定的写保护区域,使别的程序无法占用这个内存区域。

[DllImport("winmm.dll")]:是Windows多媒体相关应用程序接口,用于低档的音频和游戏手柄。

 

3、实现代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace test1
{
public partial class Form1 : Form
    { 
        [DllImport("kernel32.dll")]
public static extern bool Beep(int freq, int duration);        
        [DllImport("winmm.dll")]
public static extern bool PlaySound(string pszSound, int hmod, int fdwSound);//播放windows音乐,重载
//进入系统播放音乐  
private void m_SystemPlayWav(string strPlayFile)
        {
try
            {
if (strPlayFile.Trim() == "")
                {
return;
                }
int SND_FILENAME = 0x00020000;
int SND_ASYNC = 0x0001;
string strPath = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
                strPath = strPath + strPlayFile;
                PlaySound(strPath, 0, SND_ASYNC | SND_FILENAME);//播放音乐
            }
catch (Exception ex)
            {
MessageBox.Show("播放失败","提示");
            }
        }
private void m_SystemStopPlayWav()
        {
try
            {
                PlaySound(null, 0, 0x40 | 0x04 | 0x02);
            }
catch (Exception ex)
            {
MessageBox.Show("停止失败", "提示");
            }
        }   
public Form1()
        {
            InitializeComponent();
        }  
private void button2_Click(object sender, EventArgs e)
        {
            m_SystemPlayWav(comboBox1.SelectedItem.ToString()); 
        }
private void button3_Click(object sender, EventArgs e)
        {
            m_SystemStopPlayWav();
        }
private void button4_Click(object sender, EventArgs e)
        { 
            Beep(400, 300); 
        }
 
private void button5_Click(object sender, EventArgs e)
        {
            Beep(500, 300); 
        }
private void button6_Click(object sender, EventArgs e)
        {
            Beep(600, 300); 
        }
private void button7_Click(object sender, EventArgs e)
        {
            Beep(700, 300); 
        }
private void button8_Click(object sender, EventArgs e)
        {
            Beep(800, 300); 
        }
private void button9_Click(object sender, EventArgs e)
        {
            Beep(900, 300); 
        }
private void button10_Click(object sender, EventArgs e)
        {
            Beep(1000, 300); 
        } 
private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
if (e.KeyCode == Keys.D1)
            {
                button4.BackColor = System.Drawing.Color.LightGreen; ;
                button4.PerformClick();
                button4.BackColor = System.Drawing.Color.Black;
            }
if (e.KeyCode == Keys.D2)
            {
                button5.BackColor = System.Drawing.Color.LightGreen;
                button5.PerformClick();
                button5.BackColor = System.Drawing.Color.White;
            }
if (e.KeyCode == Keys.D3)
            {
                button6.BackColor = System.Drawing.Color.LightGreen;
                button6.PerformClick();
                button6.BackColor = System.Drawing.Color.Black;
            }
if (e.KeyCode == Keys.D4)
            {
                button7.BackColor = System.Drawing.Color.LightGreen;
                button7.PerformClick();
                button7.BackColor = System.Drawing.Color.White;
            }
if (e.KeyCode == Keys.D5)
            {
                button8.BackColor = System.Drawing.Color.LightGreen;
                button8.PerformClick();
                button8.BackColor = System.Drawing.Color.Black;
            }
if (e.KeyCode == Keys.D6)
            {
                button9.BackColor = System.Drawing.Color.LightGreen;
                button9.PerformClick();
                button9.BackColor = System.Drawing.Color.White;
            }
if (e.KeyCode == Keys.D7)
            {
                button10.BackColor = System.Drawing.Color.LightGreen;
                button10.PerformClick();
                button10.BackColor = System.Drawing.Color.Black;
            }
if (e.KeyCode == Keys.Enter)
            {
                button2.PerformClick();//enter键播放
            }
if (e.KeyCode == Keys.Space)
            {
                button3.PerformClick();//space键停止
            }
        }   
    }
}