代码之家  ›  专栏  ›  技术社区  ›  thomasb DaveRead

启动时将程序放入系统托盘

  •  16
  • thomasb DaveRead  · 技术社区  · 16 年前

    我按照通常链接的提示将应用程序减少到系统托盘: http://www.developer.com/net/csharp/article.php/3336751 现在它可以工作了,但仍然有一个问题:我的应用程序在启动时显示出来;我希望它直接在Systray中启动。我试图最小化并在加载事件中隐藏它,但它什么也不做。

    编辑:正如海报建议的那样,我可以修改快捷方式属性,但我宁愿使用代码:我无法完全控制安装软件的每台计算机。

    除了Systray,我不想把它从任何地方完全删除,我只想让它开始最小化。

    有什么想法吗?

    谢谢

    7 回复  |  直到 14 年前
        1
  •  26
  •   Sunlight    16 年前

    在主程序中,您可能有一行表单:

    Application.Run(new Form1());
    

    这将强制显示窗体。您需要创建表单,但是 把它传递给 Application.Run :

    Form1 form = new Form1();
    Application.Run();
    

    请注意,直到您调用 Application.ExitThread() . 最好是由 FormClosed 事件。

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        Application.ExitThread();
    }
    
        2
  •  13
  •   lubos hasko    16 年前

    你就是这样做的

    static class Program
    {
        [STAThread]
        static void Main()
        {
            NotifyIcon icon = new NotifyIcon();
            icon.Icon = System.Drawing.SystemIcons.Application;
            icon.Click += delegate { MessageBox.Show("Bye!"); icon.Visible = false; Application.Exit(); };
            icon.Visible = true;
            Application.Run();
        }
    }
    
        3
  •  3
  •   Marc Gravell    16 年前

    如果您使用 NotifyIcon ,尝试将showintaskbar更改为false。

    要将其从alt+tab屏幕中删除,请尝试更改窗口边框样式;我相信某些工具窗口样式不会显示…

    类似:

    using System;
    using System.Windows.Forms;
    class MyForm : Form
    {
        NotifyIcon sysTray;
    
        MyForm()
        {
            sysTray = new NotifyIcon();
            sysTray.Icon = System.Drawing.SystemIcons.Asterisk;
            sysTray.Visible = true;
            sysTray.Text = "Hi there";
            sysTray.MouseClick += delegate { MessageBox.Show("Boo!"); };
    
            ShowInTaskbar = false;
            FormBorderStyle = FormBorderStyle.SizableToolWindow;
            Opacity = 0;
            WindowState = FormWindowState.Minimized;
        }
    
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new MyForm());
        }
    }
    

    如果它仍然出现在alt+选项卡中,则可以通过p/invoke更改窗口样式(稍微有点hackier):

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        IntPtr handle = this.Handle;
        int currentStyle = GetWindowLong(handle, GWL_EXSTYLE);
        SetWindowLong(handle, GWL_EXSTYLE, currentStyle | WS_EX_TOOLWINDOW);
    }
    private const int GWL_EXSTYLE = -20, WS_EX_TOOLWINDOW = 0x00000080;
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern int SetWindowLong(IntPtr window, int index, int value);
    [System.Runtime.InteropServices.DllImport("user32.dll")]
    private static extern int GetWindowLong(IntPtr window, int index);
    
        4
  •  2
  •   xan    16 年前

    作为一个小小的尝试,你可以将启动应用程序的快捷方式配置为“最小化运行”?这可能会给你所需要的!

    就像这样:(图片只是谷歌的一个例子)

    Run Minimized http://www.unixwiz.net/images/ygpm-shortcut-4.gif

        5
  •  1
  •   rjrapson    16 年前

    因为这是用vb.net标记的,下面是我在一个Windows服务和控制器应用程序中所做的,我刚刚完成了,在项目中添加了一个代码模块,在sub main()中设置了notifyIcon及其关联的上下文菜单,然后将应用程序的启动对象设置为sub main()而不是表单。

    Public mobNotifyIcon As NotifyIcon
    Public WithEvents mobContextMenu As ContextMenu
    
    Public Sub Main()
    
        mobContextMenu = New ContextMenu
        SetupMenu()
        mobNotifyIcon = New NotifyIcon()
        With mobNotifyIcon
            .Icon = My.Resources.NotifyIcon
            .ContextMenu = mobContextMenu
            .BalloonTipText = String.Concat("Monitor the EDS Transfer Service", vbCrLf, "Right click icon for menu")
            .BalloonTipIcon = ToolTipIcon.Info
            .BalloonTipTitle = "EDS Transfer Monitor"
            .Text = "EDS Transfer Service Monitor"
            AddHandler .MouseClick, AddressOf showBalloon
            .Visible = True
        End With
        Application.Run()
    End Sub
    
    Private Sub SetupMenu()
        With mobContextMenu
    
            .MenuItems.Add(New MenuItem("Configure", New EventHandler(AddressOf Config)))
            .MenuItems.Add("-")
            .MenuItems.Add(New MenuItem("Start", New EventHandler(AddressOf StartService)))
            .MenuItems.Add(New MenuItem("Stop", New EventHandler(AddressOf StopService)))
            .MenuItems.Add("-")
            .MenuItems.Add(New MenuItem("Exit", New EventHandler(AddressOf ExitController)))
        End With
        GetServiceStatus()
    End Sub
    

    在config()中,我创建表单的一个实例并显示它。

    Private Sub Config(ByVal sender As Object, ByVal e As EventArgs)
        Using cs As New ConfigureService
            cs.Show()
        End Using
    
    End Sub
    
        6
  •  0
  •       16 年前

    干得好:

    创建2个类,1个从ApplicationContext继承。另一个只包含一个主例程。我做了一个例子,其中有一个表单和一个通知图标,当双击时,会再次显示表单。

    记住在“我的项目设置”中将“Sub-Main”设置为启动对象,并指向一个真正的*.ico文件,而不是f:\tp.ico.。:)

    当然,代码中应该填充适当的错误处理代码。

    第一类:

    Imports System.threading 
    Imports System.Runtime.InteropServices 
    Imports System.Windows.Forms
    
    
    Public Class Class1
    
        <System.STAThread()> _
            Public Shared Sub Main()
    
            Try
                System.Windows.Forms.Application.EnableVisualStyles()
                System.Windows.Forms.Application.DoEvents()
                System.Windows.Forms.Application.Run(New Class2)
            Catch invEx As Exception
    
                Application.Exit()
    
            End Try
    
    
        End Sub 'Main End Class 
    

    第二类:

    Imports System.Windows.Forms  
    Imports System.drawing
    
    Public Class Class2
        Inherits System.Windows.Forms.ApplicationContext
    
        Private WithEvents f As New System.Windows.Forms.Form
        Private WithEvents nf As New System.Windows.Forms.NotifyIcon
    
        Public Sub New()
    
            f.Size = New Drawing.Size(50, 50)
            f.StartPosition = FormStartPosition.CenterScreen
            f.WindowState = Windows.Forms.FormWindowState.Minimized
            f.ShowInTaskbar = False
            nf.Visible = True
            nf.Icon = New Icon("f:\TP.ico")
        End Sub
    
    
        Private Sub nf_DoubleClick(ByVal sender As Object, ByVal e As EventArgs) Handles nf.DoubleClick
            If f.WindowState <> Windows.Forms.FormWindowState.Minimized Then
                f.WindowState = Windows.Forms.FormWindowState.Minimized
                f.Hide()
            Else
                f.WindowState = Windows.Forms.FormWindowState.Normal
                f.Show()
            End If
        End Sub
    
        Private Sub f_FormClosed(ByVal sender As Object, ByVal e As FormClosedEventArgs) Handles f.FormClosed
            Application.Exit()
        End Sub  End Class
    
        7
  •  0
  •   community wiki TheUberOverLord    16 年前

    这将向您展示如何使用notifyicon将启动控制为最小化或正常以及更多。

    这里更多: http://code.msdn.microsoft.com/TheNotifyIconExample