[乱搞系列]用C#写自动播放系统

学校里要做课上操,上去播放好麻烦的哦……于是——

AutoPlay System诞生了!

AutoPlay System(自动播放系统)为W-RB独立制作,基于.NET Framework 4.7.2,用C# Winform写的一个小软件,以便于不用每次去找视频播放了。是不是很心动呢?那我们开始吧

主要思想

新建线程,每隔几秒获取新一次时间并判断是否到达时间,若到达则打开.mp4文件。写入注册表实现开机自启动,隐藏进入托盘实现后台运行。

代码环境

C# Winform

Visual Studio 2019

Windows 10系统。

正式制作!

首先,我们先创建一个C# Winform项目。这里过程就先略去了。

#写入注册表

然后进入代码界面。我们先来写入注册表,代码如下:

path = Application.ExecutablePath;
RegistryKey rk = Registry.LocalMachine;
RegistryKey rk2 = rk.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");//注册表路径
rk2.SetValue("AutoPlay_System", path);//此处的"AutoPlay_System"可以自行起名
rk2.Close();
rk.Close();

此段代码应写在public Form1()内,InitializeComponent();之前。

别忘了还要定义一个string,用于存放路径:

public string path;

至此,注册表写入已经完成,接着我们来做时间的获取:

#时间获取

首先我们定义一个字符串TTimes,它是应播放的时间点,用于判断。

public string TTimes = "9:45";

这里的时间可以随意填,格式为小时:分钟

注意:这里的冒号必须用英文格式。

然后再定义一个字符串Times,用于获取时间。

public string Times = DateTime.Now.ToShortTimeString().ToString();

DateTime.Now.ToShortTimeString().ToString();的作用是获取当前时间,返回格式是小时:分钟

然后加入判断与打开文件:

#判断&打开文件

if (Times == TTimes)
{
    System.Diagnostics.Process.Start("D:\\体育三操\\课上操.mp4");//打开文件
}

一切看起来都那么的美好。本文章到此结束了。

才怪啊啊啊啊

刚保存完文件,我才想起来,我还没加循环怎么一直判断啊啊啊啊

然后我们加上while循环:

#While循环

while (true)
{
    if (Times == TTimes)
    {
        System.Diagnostics.Process.Start("D:\\体育三操\\课上操.mp4");
    }
}

不错,但是我们还意识到了一个问题:

While循环加在哪里啊啊啊啊

这个问题似乎很好解决,我们可以新开一个线程(RIGHT)

#多线程

Thread che = new Thread(new ThreadStart(Check));
che.Start();

那……这个Check怎么报错啊?

其实这个Check是个函数,线程的运行函数。我们写一个函数:

private void Check()
{
    while (true)
    {        
        if (Times == TTimes)
        {
            System.Diagnostics.Process.Start("D:\\体育三操\\课上操.mp4");
            Thread.Sleep(100000);//停止线程1分钟防止屡次打开
        }
        Thread.Sleep(5000);//停止线程5000ms,防止CPU炸掉
}

很完美,这篇文章结束了。

才怪啊啊啊啊

怎么开了多线程还是判断不好啊啊啊啊

这时,我灵机一动!我一直没用更新现在时间欸

于是:

private void Check()
{
    while (true)
    {
        Times = DateTime.Now.ToShortTimeString().ToString();
        if (Times == TTimes)
        {
            System.Diagnostics.Process.Start("D:\\体育三操\\课上操.mp4");
            Thread.Sleep(100000);//停止线程1分钟防止屡次打开
        }
        Thread.Sleep(5000);//停止线程5000ms,防止CPU炸掉
}

至此,判断已经做好,接下来我们做后台~

#后台运行

我是自己做了个button。首先先拖一个button

private void button2_Click(object sender, EventArgs e)
{
    closs();
}

然后写个closs函数

private void closs()
{
    this.Visible = false;
    this.ShowInTaskbar = false;
    notifyIcon1.Visible = true;
}

那么……notifyIcon1是个啥?

我们拖一个notifyIcon控件,再拖一个contextNemuStrip。

notifyIcon1在属性栏Icon里随便弄一个,然后把ContextNemuStrip挂到刚刚拖出来的contextNemuStrip1.

然后点击contextNemuStrip1,可以看到上面有一点白边。我们加入"显示"和"退出"

然后分别双击"显示"和"退出",写下代码。

private void 显示ToolStripMenuItem_Click_1(object sender, EventArgs e)
{
    this.Visible = true;
}

注意:这个好像通过退出无法退出,我们可以加一个提示让他从任务管理器退出

private void 退出ToolStripMenuItem_Click_1(object sender, EventArgs e)
{
    if (MessageBox.Show("是否确认退出程序?", "退出", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
    {
        MessageBox.Show("本按钮无法退出程序\n请从任务管理器中关闭", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
}

这样就差不多了,可以自己在搞一搞。

最后放上我的全部代码:

#全部代码

using System;
using Microsoft.Win32;
using System.Windows.Forms;
using System.Threading;

namespace AutoPlay_System
{
    public partial class Form1 : Form
    {
        public string Times = DateTime.Now.ToShortTimeString().ToString();
        public string TTimes = "9:45";
        public string path;
        public Form1()
        {
            path = Application.ExecutablePath;
            RegistryKey rk = Registry.LocalMachine;
            RegistryKey rk2 = rk.CreateSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\Run");
            rk2.SetValue("AutoPlay_System", path);
            rk2.Close();
            rk.Close();
            Thread che = new Thread(new ThreadStart(Check));
            che.Start();
            InitializeComponent();
        }

        private void Check()
        {
            while (true)
            {
                Times = DateTime.Now.ToShortTimeString().ToString();
                if (Times == TTimes)
                {
                    System.Diagnostics.Process.Start("D:\\体育三操\\课上操.mp4");
                    Thread.Sleep(100000);
                }
                Thread.Sleep(5000);
            }

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            MessageBox.Show("AutoPlay System已启动!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            closs();
        }

        private void closs()
        {
            this.Visible = false;
            this.ShowInTaskbar = false;
            notifyIcon1.Visible = true;
        }

        private void 显示ToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            this.Visible = true;
        }

        private void 退出ToolStripMenuItem_Click_1(object sender, EventArgs e)
        {
            if (MessageBox.Show("是否确认退出程序?", "退出", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
            {
                MessageBox.Show("本按钮无法退出程序\n请从任务管理器中关闭", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }
    }
}

[乱搞系列]用C#写自动播放系统

上一篇:(C# webservice 获取客户端IP疑难杂症)---试过n种方法都失败,获取代理服务器,访问者客户端真实IP


下一篇:SQL开发中容易忽视的一些小地方(四)