1. 程式人生 > 實用技巧 >[亂搞系列]用C#寫自動播放系統

[亂搞系列]用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);
            }
        }
    }
}