最小化时如何将.net应用程序放在系统托盘中?
时间:2020-03-05 18:56:57 来源:igfitidea点击:
有人可以建议一个很好的vb.net/ccode代码示例,以便在最小化时将应用程序放入系统托盘。
解决方案
回答
将NotifyIcon控件添加到窗体,然后使用以下代码:
private void frm_main_Resize(object sender, EventArgs e) { if (this.WindowState == FormWindowState.Minimized) { this.ShowInTaskbar = false; this.Hide(); notifyIcon1.Visible = true; } } private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) { this.Show(); this.WindowState = FormWindowState.Normal; this.ShowInTaskbar = true; notifyIcon1.Visible = false; }
我们可能不需要设置ShowInTaskbar属性。
回答
我们可以利用一个称为NotifyIcon的内置控件。如图所示,这将创建一个托盘图标。 @Phillip的代码示例有些完整。
不过有一个陷阱:
我们必须覆盖应用程序主窗体的Dispose方法,以在NotifyIcon上调用Dispose,否则在应用程序退出后它将保留在任务栏中。
public void Form_Dispose(object sender, EventArgs e) { if (this.Disposing) notifyIcon1.Dispose(); }
这样的事情。
回答
我们可以通过在表单中添加NotifyIcon并处理表单的resize事件来做到这一点。要从托盘取回,请处理NotifyIcon的双击事件。
如果我们想添加一些动画,也可以这样做...
1)添加以下模块:
Module AnimatedMinimizeToTray Structure RECT Public left As Integer Public top As Integer Public right As Integer Public bottom As Integer End Structure Structure APPBARDATA Public cbSize As Integer Public hWnd As IntPtr Public uCallbackMessage As Integer Public uEdge As ABEdge Public rc As RECT Public lParam As IntPtr End Structure Enum ABMsg ABM_NEW = 0 ABM_REMOVE = 1 ABM_QUERYPOS = 2 ABM_SETPOS = 3 ABM_GETSTATE = 4 ABM_GETTASKBARPOS = 5 ABM_ACTIVATE = 6 ABM_GETAUTOHIDEBAR = 7 ABM_SETAUTOHIDEBAR = 8 ABM_WINDOWPOSCHANGED = 9 ABM_SETSTATE = 10 End Enum Enum ABNotify ABN_STATECHANGE = 0 ABN_POSCHANGED ABN_FULLSCREENAPP ABN_WINDOWARRANGE End Enum Enum ABEdge ABE_LEFT = 0 ABE_TOP ABE_RIGHT ABE_BOTTOM End Enum Public Declare Function SHAppBarMessage Lib "shell32.dll" Alias "SHAppBarMessage" (ByVal dwMessage As Integer, ByRef pData As APPBARDATA) As Integer Public Const ABM_GETTASKBARPOS As Integer = &H5& Public Const WM_SYSCOMMAND As Integer = &H112 Public Const SC_MINIMIZE As Integer = &HF020 Public Sub AnimateWindow(ByVal ToTray As Boolean, ByRef frm As Form, ByRef icon As NotifyIcon) ' get the screen dimensions Dim screenRect As Rectangle = Screen.GetBounds(frm.Location) ' figure out where the taskbar is (and consequently the tray) Dim destPoint As Point Dim BarData As APPBARDATA BarData.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(BarData) SHAppBarMessage(ABMsg.ABM_GETTASKBARPOS, BarData) Select Case BarData.uEdge Case ABEdge.ABE_BOTTOM, ABEdge.ABE_RIGHT ' Tray is to the Bottom Right destPoint = New Point(screenRect.Width, screenRect.Height) Case ABEdge.ABE_LEFT ' Tray is to the Bottom Left destPoint = New Point(0, screenRect.Height) Case ABEdge.ABE_TOP ' Tray is to the Top Right destPoint = New Point(screenRect.Width, 0) End Select ' setup our loop based on the direction Dim a, b, s As Single If ToTray Then a = 0 b = 1 s = 0.05 Else a = 1 b = 0 s = -0.05 End If ' "animate" the window Dim curPoint As Point, curSize As Size Dim startPoint As Point = frm.Location Dim dWidth As Integer = destPoint.X - startPoint.X Dim dHeight As Integer = destPoint.Y - startPoint.Y Dim startWidth As Integer = frm.Width Dim startHeight As Integer = frm.Height Dim i As Single For i = a To b Step s curPoint = New Point(startPoint.X + i * dWidth, startPoint.Y + i * dHeight) curSize = New Size((1 - i) * startWidth, (1 - i) * startHeight) ControlPaint.DrawReversibleFrame(New Rectangle(curPoint, curSize), frm.BackColor, FrameStyle.Thick) System.Threading.Thread.Sleep(15) ControlPaint.DrawReversibleFrame(New Rectangle(curPoint, curSize), frm.BackColor, FrameStyle.Thick) Next If ToTray Then ' hide the form and show the notifyicon frm.Hide() icon.Visible = True Else ' hide the notifyicon and show the form icon.Visible = False frm.Show() End If End Sub End Module
2)在表单中添加一个NotifyIcon,然后添加以下内容:
Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message) If m.Msg = WM_SYSCOMMAND AndAlso m.WParam.ToInt32() = SC_MINIMIZE Then AnimateWindow(True, Me, NotifyIcon1) Exit Sub End If MyBase.WndProc(m) End Sub Private Sub NotifyIcon1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles NotifyIcon1.DoubleClick AnimateWindow(False, Me, NotifyIcon1) End Sub