-
VB.net怎么最小化到系统托盘
小孩放假了,天天在电脑上看动画片,时间有点长,对小孩视力和身体都不好,准备自己写个有个性的保护程序,就是固定时间直接播放声音,并锁定屏幕一定间隔,过后程序自动最小化到托盘。现在遇到问题,不知道vb.net程序 怎么最小化到系统托盘,百度到一篇资料CP过来参考。新浪微博对代码支持不好,排序有问题,可以直接查阅: http://oteman.blog.sohu.com/47614796.html
所谓静态托盘程序是指程序运行后,在系统托盘区的图标处于静止状态的托盘程序。动态托盘程序正好与之相反,它是指在系统托盘区图标呈现动画效果的一类托盘程序。下面就来探讨一下VB.NET是如何实现静态托盘程序。 .Net FrameWork SDK为编写托盘程序提供了一个组件:NotifyIcon组件。NotifyIcon组件是一个WinForm组件,位于命名空间"System.Windows.Forms"中,在VB.NET程序中,只要创建一个NotifyIcon组件的实例,并且对NotifyIcon实例的"Icon"属性赋值,这样一个简单的托盘程序就完成了。下面就是这个简单托盘程序对于的代码(Form1.vb):
Public Class Form1 Inherits System.Windows.Forms.Form #Region " Windows 窗体设计器生成的代码 " Public Sub New ( ) MyBase.New ( ) '该调用是 Windows 窗体设计器所必需的。 InitializeComponent ( ) '在 InitializeComponent ( ) 调用之后添加任何初始化 End Sub '窗体重写处置以清理组件列表。 Protected Overloads Overrides Sub Dispose ( ByVal disposing As Boolean ) If disposing Then If Not ( components Is Nothing ) Then components.Dispose ( ) End If End If MyBase.Dispose ( disposing ) End Sub 'Windows 窗体设计器所必需的 Private components As System.ComponentModel.IContainer '注意:以下过程是 Windows 窗体设计器所必需的 '可以使用 Windows 窗体设计器修改此过程。 '不要使用代码编辑器修改它。 Friend WithEvents NotifyIcon1 As System.Windows.Forms.NotifyIcon '创建一个NotifyIcon实例 Friend TrayIcon = New Icon ( "Tray.ico" ) '创建一个Icon实例 <System.Diagnostics.DebuggerStepThrough ( ) > Private Sub InitializeComponent ( ) Me.components = New System.ComponentModel.Container ( ) Me.NotifyIcon1 = New System.Windows.Forms.NotifyIcon ( Me.components ) Me.NotifyIcon1.Text = "NotifyIcon1" Me.NotifyIcon1.Visible = True '对NotifyIcon实例的Icon属性赋值,完成简单托盘程序 Me.NotifyIcon1.Icon = TrayIcon Me.AutoScaleBaseSize = New System.Drawing.Size ( 6 , 14 ) Me.ClientSize = New System.Drawing.Size ( 292 , 273 ) Me.Name = "Form1" Me.Text = "Form1" End Sub #End Region End Class '启动程序 Module Module1 Sub Main ( ) Application.Run ( new Form1 ( ) ) End sub End Module |
但是这个托盘程序还不是真正意义上的托盘程序,因为它还有很多具体功能没有实现,下面就列出这些功能,并介绍具体的实现方法
(1).托盘程序是隐藏窗口后,程序不应该显示在任务栏中,并且一般运行后都不显示窗口:
这是通过设定窗体的属性来完成的,具体如下:
'设定程序不应该显示在任务栏 Me.ShowInTaskbar = False '设定程序运行后最小化 Me.WindowState = System.Windows.Forms.FormWindowState.Minimized |
(2).定义托盘程序中的菜单和相关事件:
往NotifyIcon实例中添加菜单,首先要创建ContextMenu实例,此实例主要作用是表示快捷菜单,其中的菜单项是通过创建MenuItem实例来实现,托盘程序中的菜单有几个菜单项,就创建几个MenuItem实例。然后把这些菜单项加入到ContextMenu实例,并把此实例赋值给NotifyIcon实例的ContextMenu属性,这样托盘程序右键点击弹出的菜单就完成了。下面是具体代码:
创建ContextMenu实例和MenuItem实例: Friend WithEvents ContextMenu1 As System.Windows.Forms.ContextMenu Friend WithEvents MenuItem1 As System.Windows.Forms.MenuItem Friend WithEvents MenuItem2 As System.Windows.Forms.MenuItem Friend WithEvents MenuItem3 As System.Windows.Forms.MenuItem |
把这些菜单项加入到ContextMenu实例,并把ContextMenu实例赋值给NotifyIcon实例的ContextMenu属性:
Me.MenuItem1 = New System.Windows.Forms.MenuItem ( ) Me.MenuItem2 = New System.Windows.Forms.MenuItem ( ) Me.MenuItem3 = New System.Windows.Forms.MenuItem ( ) Me.NotifyIcon1.ContextMenu = Me.ContextMenu1 Me.NotifyIcon1.Text = "VB.NET的托盘程序" Me.NotifyIcon1.Visible = True '设定托盘程序托盘区位置显示图标 Me.NotifyIcon1.Icon = TrayIcon '在ContextMenu实例中加入菜单项 Me.ContextMenu1.MenuItems.Add ( Me.MenuItem1 ) Me.ContextMenu1.MenuItems.Add ( Me.MenuItem2 ) Me.ContextMenu1.MenuItems.Add ( Me.MenuItem3 ) Me.MenuItem1.Index = 0 Me.MenuItem1.Text = "显示窗体" Me.MenuItem2.Index = 1 Me.MenuItem2.Text = "隐藏窗体" Me.MenuItem3.Index = 2 Me.MenuItem3.Text = "退出" |
当把ContextMenu实例赋值给NotifyIcon实例的ContextMenu属性后,托盘程序的缺省状态是当鼠标右击托盘图标,就会弹出对应的菜单。这时就可以对其中的每一个菜单项定义相应的事件以及具体的处理方法。一个完整的静态托盘程序的编写过程就完成了。
最后要请读者注意的是,由于本文中的托盘程序的图标并不是通过创建资源文件来实现的,而是通过创建Icon实例完成的。所以在程序运行的时候,必须在程序的当前目录存在一个图标文件,并且此图标文件的名称为"Tray.ico"。下面是这个静态托盘程序的完整的代码清单
(Form2.vb):
Public Class Form1
#Region " Windows 窗体设计器生成的代码 "
'设定托盘程序托盘区位置显示图标
'在ContextMenu实例中加入菜单项
'设定程序不应该显示在任务栏
Me.ShowInTaskbar = False
'设定程序运行后最小化
#End Region
End Class
'启动程序
Module Module1
Sub Main ( )
End sub
End Module
Form2.vb经过了下列命令编译、连接后:
Vbc /r:system.dll /r:system.windows.froms.dll /r:system.drawing.dll form2.vb
就可以得到Form2.exe,下图是From2.exe运行的界面:
Friend WithEvents NotifyIcon1 As System.Windows.Forms.NotifyIcon Friend WithEvents ContextMenu1 As System.Windows.Forms.ContextMenu Friend WithEvents MenuItem1 As System.Windows.Forms.MenuItem Friend WithEvents MenuItem2 As System.Windows.Forms.MenuItem Friend WithEvents MenuItem3 As System.Windows.Forms.MenuItem '创建Icon实例,用以切换图标 Friend Icon1 = New Icon ( "icon1.ico" ) Friend Icon2 = New Icon ( "icon2.ico" ) '为不同图标的切换提供标识符 Dim BeginFlag As Boolean = True '定时器 Friend WithEvents Timer1 As System.Windows.Forms.Timer |
初始化实例:
Me.components = New System.ComponentModel.Container ( ) Me.NotifyIcon1 = New System.Windows.Forms.NotifyIcon ( Me.components ) Me.ContextMenu1 = New System.Windows.Forms.ContextMenu ( ) Me.MenuItem1 = New System.Windows.Forms.MenuItem ( ) Me.MenuItem2 = New System.Windows.Forms.MenuItem ( ) Me.MenuItem3 = New System.Windows.Forms.MenuItem ( ) Me.Timer1 = New System.Windows.Forms.Timer ( Me.components ) Me.NotifyIcon1.ContextMenu = Me.ContextMenu1 Me.NotifyIcon1.Text = "VB.NET的托盘程序" Me.NotifyIcon1.Visible = True '设定托盘程序托盘区位置显示缺省图标 Me.NotifyIcon1.Icon = Icon1 '在ContextMenu实例中加入菜单项 Me.ContextMenu1.MenuItems.Add ( Me.MenuItem1 ) Me.ContextMenu1.MenuItems.Add ( Me.MenuItem2 ) Me.ContextMenu1.MenuItems.Add ( Me.MenuItem3 ) Me.MenuItem1.Index = 0 Me.MenuItem1.Text = "开始转动" Me.MenuItem2.Index = 1 Me.MenuItem2.Text = "停止转动" Me.MenuItem3.Index = 2 Me.MenuItem3.Text = "退出" Me.AutoScaleBaseSize = New System.Drawing.Size ( 6 , 14 ) Me.ClientSize = New System.Drawing.Size ( 292 , 273 ) Me.Name = "Form1" Me.ShowInTaskbar = False Me.Text = "VB.NET之WinForm编程动态托盘程序" Me.WindowState = System.Windows.Forms.FormWindowState.Minimized |
定义托盘程序中菜单项对应的事件,以及具体的处理方法:
'开始托盘图标的转动 Private Sub MenuItem1_Click ( ByVal sender As System.Object , ByVal e As System.EventArgs ) Handles MenuItem1.Click Timer1.Enabled = True End Sub '停止托盘图标的转动 Private Sub MenuItem2_Click ( ByVal sender As Object , ByVal e As System.EventArgs ) Handles MenuItem2.Click Timer1.Enabled = False End Sub '关闭程序,清除托盘资源 Private Sub MenuItem3_Click ( ByVal sender As Object , ByVal e As System.EventArgs ) Handles MenuItem3.Click NotifyIcon1.Dispose ( ) Application.Exit ( ) End Sub '根据标识符,来确定托盘图标类型 Private Sub Timer1_Tick ( ByVal sender As Object , ByVal e As System.EventArgs ) Handles Timer1.Tick If BeginFlag = True Then NotifyIcon1.Icon = Icon2 BeginFlag = False Else NotifyIcon1.Icon = Icon1 BeginFlag = True End If End Sub |
至此编写动态托盘程序的主要步骤就介绍完了,和上面的静态托盘程序相同,在运行此程序的时候必须保证此程序当前目录存在二个Icon文件,并且名称为"Icon1.ico"和"Icon2.ico"。这里并没有给出动态托盘程序的完整代码清单,读者只需要把上面这些关键步骤的代码覆盖到Form2.vb中的相应位置就可以得到动态托盘程序的源程序文件Form3.vb。这应该不算很难,下面是编译Form3.vb的命令:
Vbc /r:system.dll /r:system.windows.froms.dll /r:system.drawing.dll form2.vb |
成功编译、连接后就得到Form3.exe,下图是Form3.exe的运行界面:
栏目列表
最新更新
求1000阶乘的结果末尾有多少个0
详解MyBatis延迟加载是如何实现的
IDEA 控制台中文乱码4种解决方案
SpringBoot中版本兼容性处理的实现示例
Spring的IOC解决程序耦合的实现
详解Spring多数据源如何切换
Java报错:UnsupportedOperationException in Col
使用Spring Batch实现批处理任务的详细教程
java中怎么将多个音频文件拼接合成一个
SpringBoot整合ES多个精确值查询 terms功能实
数据库审计与智能监控:从日志分析到异
SQL Server 中的数据类型隐式转换问题
SQL Server中T-SQL 数据类型转换详解
sqlserver 数据类型转换小实验
SQL Server数据类型转换方法
SQL Server 2017无法连接到服务器的问题解决
SQLServer地址搜索性能优化
Sql Server查询性能优化之不可小觑的书签查
SQL Server数据库的高性能优化经验总结
SQL SERVER性能优化综述(很好的总结,不要错
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比