代码之家  ›  专栏  ›  技术社区  ›  bugBurger

如何在最小化的情况下将.net应用程序放入系统托盘中?

  •  9
  • bugBurger  · 技术社区  · 17 年前

    谁能推荐一个 好的代码示例 在小型化时,使用vb.net/c代码将应用程序放入系统托盘中。

    3 回复  |  直到 17 年前
        1
  •  18
  •   Phillip Wells    17 年前

    在表单中添加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属性。

        2
  •  2
  •   FlySwat    17 年前

    您可以利用名为NotifyIcon的内置控件。这将在显示时创建一个托盘图标。@Phillip有一个比较完整的代码示例。

    但有一个陷阱:

    您必须覆盖应用程序主窗体的DISPLAY方法,以便在NotifyIcon上调用DISPLAY,否则它将在应用程序退出后留在您的托盘中。

    public void Form_Dispose(object sender, EventArgs e)
    {
       if (this.Disposing)
          notifyIcon1.Dispose();
    }
    

    类似的东西。

        3
  •  0
  •   the Tin Man    17 年前

    您可以通过在表单中添加NotifyIcon并处理表单的调整大小事件来实现这一点。要从托盘中返回,请处理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
    
    推荐文章