zoukankan      html  css  js  c++  java
  • [乱搞系列]用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(@"SOFTWAREMicrosoftWindowsCurrentVersionRun");//注册表路径
    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("本按钮无法退出程序
    请从任务管理器中关闭", "提示", 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(@"SOFTWAREMicrosoftWindowsCurrentVersionRun");
                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("本按钮无法退出程序
    请从任务管理器中关闭", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
            }
        }
    }
    
  • 相关阅读:
    ES6小点心第二弹——底部浮现弹窗
    ES6小点心之通用弹窗
    从输入URL到页面加载的过程?如何由一道题完善自己的前端知识体系!
    【quickhybrid】如何实现一个Hybrid框架
    【开源】canvas图像裁剪、压缩、旋转
    优雅的H5下拉刷新【minirefresh】
    前端筑基篇(一)->ajax跨域原理以及解决方案
    钉钉开放与商业化团队前端大量招人
    AJAX请求真的不安全么?谈谈Web安全与AJAX的关系。
    【quickhybrid】iOS端的项目实现
  • 原文地址:https://www.cnblogs.com/w-rb/p/13693288.html
Copyright © 2011-2022 走看看