【问题标题】:How to play a sound regularly with timer_tick? [closed]如何使用 timer_tick 定期播放声音? [关闭]
【发布时间】:2020-09-13 17:52:50
【问题描述】:

如何在计时器中播放声音?还是有其他方法可以做到这一点?我想每 20 分钟播放一次短音。 我的代码可以在计时器中正常显示消息框,也可以通过按钮播放声音。但无法在计时器中播放声音。

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;
using System.Media;

namespace Eye
{
    public partial class Form1 : Form
    {

        System.Media.SoundPlayer player = new System.Media.SoundPlayer(@"C:\Users\user\Desktop\Sounds\sound.wav");

        public int makroButon;
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            timer1.Interval = 6000;
        }
        private void radioButton1_Checked(object sender, EventArgs e)
        {
            timer1.Start();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            player.Play();
        }
    }
}

【问题讨论】:

  • 您确定 Timer 确实已启动,Timer.Tick 事件实际上已连接到 timer1_Tick 处理程序,并且您的声音文件是 PCM wav 格式吗?
  • 如果我在 timer1_Tick 中放了一个 MessageBox.Show 命令,它就会正常工作。如果我尝试用按钮播放声音,它也在播放。我也尝试在另一个函数中播放它,只是从 timer1_Tick 调用该函数但仍然没有播放。
  • 做一个实验:从表单设计器中删除 Timer1 组件及其Tick 处理程序。在 player 字段定义附近添加 System.Windows.Forms.Timer playerTimer = null;。在 Form.Load 中,添加:playerTimer = new System.Windows.Forms.Timer() { Interval = 5000 }; playerTimer.Tick += (o, a) => player.Play(); playerTimer.Start();。启动项目以打开 Form1。
  • 我找到了解决方案...此代码不起作用,因为 Form1_load 什么也没做...所以计时器的间隔仍然是 100...我从设计页面更改它并且它工作。谢谢你的回答我的朋友。

标签: c# .net forms winforms timer


【解决方案1】:

所以我认为您的主要问题是单选按钮不是用于查找检查的正确控件。我使用了一个复选框,它似乎工作。我还明确地在代码中制作了计时器,并为滴答设置了事件处理程序。

    SoundPlayer player;
    private Timer timer1;

    public int makroButon;
    public Form1()
    {
        InitializeComponent();
        player = new System.Media.SoundPlayer(@"C:\path\sound.wav");
        timer1 = new Timer();
        timer1.Tick += Timer1_Tick;
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        timer1.Interval = 6000;
    }

    private void Timer1_Tick(object sender, EventArgs e)
    {
        player.Play();
    }

    private void CheckBox1_CheckedChanged(object sender, EventArgs e)
    {
        if(sender is CheckBox cb)
        {
            if (cb.Checked)
            {
                timer1.Start();
            }
            else
            {
                timer1.Stop();
            }
        }
    }

【讨论】:

  • 你错过了 cmets。 OP 终于发现从未订阅过 Load 事件。 phantom Handler 是手动添加的,从未真正连接。
【解决方案2】:

我手动创建了 Form1_Load。所以timer1.Interval = 6000; 行不起作用。可能 100 毫秒不足以播放声音。要创建 form1_load 函数,请不要手动输入,只需在设计页面中双击到空白处即可。它将被命名为 "Form1_Load_1",而不是 "Form1_Load"。

【讨论】:

  • ...或者您可以正确地将现有方法连接到 Load() 事件。单击窗体,然后在属性窗格中单击闪电图标以切换到事件。现在在列表中找到 Load() 事件并将右侧的下拉箭头更改为现有方法“Form1_Load”。
  • 哦,是的。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 2014-10-12
  • 1970-01-01
相关资源
最近更新 更多