任何人都可以建议一个良好的代码示例 vb.net/c#代码,以便在缩小时将应用程序放入系统托盘。

===============>>#1 票数:18 已采纳

将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

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

但是有一个问题:

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

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

这样的事情。

===============>>#3 票数:0

您可以通过向表单添加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

  ask by bugBurger translate from so

未解决问题?本站智能推荐:

1回复

如何在QT系统托盘中创建托盘

我创建了一个qt应用程序。 其中有几个链接可以连接到其他应用程序,如MS Word,Excel,IE等。单击相应的按钮时,它将链接到该应用程序。 我想要做的是,每当特定应用程序最小化时,它应该转到QT应用程序的系统托盘,而不是系统托盘。 所以我必须创建一个QT系统托盘。 您的所有建议都表
1回复

为位于系统托盘中的Java程序创建键盘挂钩

基本上我有一个在系统托盘中运行的java程序,并且想要添加make,所以如果用户按下说CTRL + SHIFT + 1,它会选择托盘中java程序的右键单击选项之一。 我想我正在寻找的是一个关于这样做的教程,或者最简单的方法。 我之前从未做过这样的事情,所以可能是某种noobie教程?
2回复

C ++ Windows系统托盘不会显示消息

我已经在这里停留了4天。 我做了一个将程序放入系统托盘的函数,但是这里的问题是它不会显示气球标题和消息 。 我究竟做错了什么? 我什至提供了一个单独的函数来确定我们正在运行哪些windows os ,并根据检测到的windows os来初始化cbSize 。 任何帮助将不胜感激。 波纹
1回复

使用tkinter的python系统托盘

我想使用python tkinter为我的应用程序创建系统托盘。 谁能让我知道如何使用python tkinter做同样的事情?
3回复

我想在系统托盘通知窗口上显示数字

我正在尝试创建一个基于通知图标的应用程序,我想在其中显示一些数字,范围从1-999。 我看了这段与我想做的视频相似的视频 ,但这里的系统任务栏图标只是显示该图标,而是显示一个弹出窗口,而不是显示数字或任何文本的系统任务栏图标。 除了弹出项目,我要做的就是读取一个数字(从某个地方输入)
1回复

如何最小化.NET中关闭事件的系统托盘表格

如何最小化.NET中关闭事件的系统托盘表格 请帮忙.....
10回复

如何创建仅在系统托盘中运行的.NET Windows窗体应用程序?

要使Windows窗体应用程序在系统托盘中运行,我需要做什么? 不是可以最小化托盘的应用程序,而是仅存在于托盘中的应用程序,只有图标,工具提示和“右键单击”菜单。
1回复

可以自定义C#中的NotifyIcon.ShowBalloonTip吗?

纯粹出于GUI虚荣,我想让我的任务栏工具提示更少......好吧,少了“我穿着西装,在微软工作”-y。 我似乎无法找到这样做的设置,但我知道这个特殊的功能是相对较新的,所以如果有人知道改变气球外观的方法,我会非常感谢链接或建议! 以下是我的代码: 干杯!! badPanda
2回复

开发一个简单的Windows系统托盘桌面应用程序来使用.NET Web服务

我需要开发一个简单的Windows系统托盘桌面应用程序来使用.NET Web服务,但我精通PHP,而且我在桌面应用程序方面几乎没有背景。 您建议我使用什么平台,最好是学习曲线非常低? 系统托盘应用程序将显示(在上下文菜单中)从.NET Web服务收到的新事件通知的计数器; 并且还会将所
4回复

带有c#控制台应用程序的系统托盘图标将不显示菜单

我有一个小的C#(.NET 4.0)控制台应用程序,我希望用户能够通过右键单击系统托盘图标时显示菜单来进行交互。 我可以在没有任何问题的情况下为托盘添加图标,但我无法显示菜单。 我正在使用以下代码: ...将图标放入托盘中。 但是,右键单击该图标不会执行任何操作。 我尝试过Men