3秒倒计时关闭显示器
本文适合新入门C#的同学了解和学习:
软件功能简单,实用。
适合有的时候电脑需要开机又想立即关闭显示器,比如下楼吃饭,比如睡觉前,还比如游戏副本挂机时候。
源代码在最后
先看界面:
这是运行界面。
这是托盘提示:
这是托盘右键菜单。
我们可以看到主要用了以下元素:
- 1.计时器,timer
- 2.托盘,notifyIcon
- 3.菜单,contextMenuStrip
- 4.关闭显示器的具体实现
隐藏边框透明效果
实现
- 1.计时器,和关闭显示器实现
布局部分就不讲解了
首先我们拖入一个timer,把enable属性设置为true,interval属性设置为1000(1秒),双击timer自动产生tick事件
int i = 3;//倒计时
private void timer1_Tick(object sender, EventArgs e)
{
i--;
//Console.WriteLine("" + i);//控制台输出
labelCountDown.Text = "" + i;
if (i == 0)
{
timer1.Stop();
WindowState = FormWindowState.Minimized;
notifyIcon1.Visible = true;//显示托盘
this.Hide(); //隐藏窗体
//开启一个线程,关闭显示器,如果在主线程关闭显示器,再激活显示器会出问题(自己试验)
Thread fThread = new Thread(new ThreadStart(closeSc));
fThread.Start();
}
}
//关闭显示器
private void closeSc(){
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, MonitorPowerOff);//关闭显示器
}
- 2.托盘,和菜单
首先我们拖入一个notifyIcon,再拖入一个contextMenuStrip,把notifyIcon的ContextMenuStrip属性设置刚刚拖入的这个contextMenuStrip,Text属性设置一个鼠标指在上面显示的值,contextMenuStrip在界面添加自己需要的菜单名称,双击菜单名字就会自动产生对应的回调监听事件
//退出程序
private void exit()
{
this.Dispose();//释放资源
this.Close();//关闭当前窗口
Application.Exit();//强制所有消息中止,退出所有的窗体
Application.ExitThread();//强制中止调用线程上的所有消息
System.Environment.Exit(0);//退出程序
}
//右键菜单关闭显示器
private void closeSC_Click(object sender, EventArgs e) {
this.Show();
this.WindowState = FormWindowState.Normal;
this.Activate();
notifyIcon1.Visible = false;//隐藏托盘
i = 3;
labelCountDown.Text = "" + i;//刷新显示为3
timer1.Start();//计时器启动
}
//关闭显示器
private void closeSc(){
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, MonitorPowerOff);//关闭显示器
}
//右键菜单退出
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
exit();
}
- 3.拦截窗体关闭按钮
这个是为了点击关闭时候最小化到托盘
//窗体关闭按钮
private void Form_main_FormClosing(object sender, FormClosingEventArgs e)
{
//窗体关闭原因为单击"关闭"按钮或Alt+F4
if (e.CloseReason == CloseReason.UserClosing)
{
WindowState = FormWindowState.Minimized;
notifyIcon1.Visible = true;//显示托盘
e.Cancel = true; //取消关闭操作 表现为不关闭窗体
this.Hide(); //隐藏窗体
}
}
完整代码
using System;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
namespace 关闭显示器
{
public partial class Form_main : Form
{
[DllImport("user32.dll")]
private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
private const uint WM_SYSCOMMAND = 0x112; //系统消息
private const int SC_MONITORPOWER = 0xF170; //关闭显示器的系统命令
private const int MonitorPowerOff = 2; //2为PowerOff, 1为省电状态,-1为开机
private const int SC_SCREENSAVE = 0xf140; // 启动屏幕保护消息
private static readonly IntPtr HWND_BROADCAST = new IntPtr(0xffff);//广播消息,所有顶级窗体都会接收
int i = 3;//倒计时
//构造函数
public Form_main()
{
//屏幕中央启动
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
InitializeComponent();
}
private void timer1_Tick(object sender, EventArgs e)
{
i--;
//Console.WriteLine("" + i);//控制台输出
labelCountDown.Text = "" + i;
if (i == 0)
{
timer1.Stop();
WindowState = FormWindowState.Minimized;
notifyIcon1.Visible = true;//显示托盘
this.Hide(); //隐藏窗体
Thread fThread = new Thread(new ThreadStart(closeSc));
fThread.Start();
// SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, MonitorPowerOff);//关闭显示器
//SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_SCREENSAVE, 0); // 启动屏保
}
}
//跳转到QQ
private void labelAuthor_Click(object sender, EventArgs e)
{
System.Diagnostics.Process.Start("https://user.qzone.qq.com/85161441");
}
//退出程序
private void exit()
{
this.Dispose();//释放资源
this.Close();//关闭当前窗口
Application.Exit();//强制所有消息中止,退出所有的窗体
Application.ExitThread();//强制中止调用线程上的所有消息
System.Environment.Exit(0);//退出程序
}
//右键菜单关闭显示器
private void closeSC_Click(object sender, EventArgs e) {
this.Show();
this.WindowState = FormWindowState.Normal;
this.Activate();
notifyIcon1.Visible = false;//隐藏托盘
i = 3;
labelCountDown.Text = "" + i;//刷新显示为3
timer1.Start();//计时器启动
}
//关闭显示器
private void closeSc(){
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, MonitorPowerOff);//关闭显示器
}
//右键菜单退出
private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
exit();
}
//窗体关闭按钮
private void Form_main_FormClosing(object sender, FormClosingEventArgs e)
{
//窗体关闭原因为单击"关闭"按钮或Alt+F4
if (e.CloseReason == CloseReason.UserClosing)
{
WindowState = FormWindowState.Minimized;
notifyIcon1.Visible = true;//显示托盘
e.Cancel = true; //取消关闭操作 表现为不关闭窗体
this.Hide(); //隐藏窗体
}
}
}
}