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