Подтвердить что ты не робот

Поместите программу в системный лоток при запуске

Я следил за общим соединением для сокращения приложения в системном лотке: http://www.developer.com/net/csharp/article.php/3336751 Теперь он работает, но есть еще проблема: мое приложение отображается, когда оно начинается; Я хочу, чтобы он начинался прямо в systray. Я попытался свести к минимуму и скрыть его в событии Load, но ничего не делает.

Изменить: я мог бы, как предложил плакат, изменить свойства ярлыка, но я бы предпочел использовать код: у меня нет полного контроля над каждым компьютером, на котором установлена ​​программа.

Я не хочу полностью удалять его извне, кроме systray, я просто хочу, чтобы он был сведен к минимуму.

Любые идеи?

Спасибо

4b9b3361

Ответ 1

В вашей основной программе вы, вероятно, имеете строку формы:

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

вот как вы это делаете

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

Если вы используете 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 + Tab, вы можете изменить стили окон через p/invoke (немного хакер):

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);

Ответ 5

Поскольку это было отмечено с помощью vb.net, вот что я сделал в приложении Windows Service and Controller, которое я только что закончил, добавьте модуль кода в проект, установите NotifyIcon и связанное с ним контекстное меню в Sub Main() и затем установите приложение Startup Object в 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

Здесь вы идете:

Создайте 2 класса, 1, которые наследуются от ApplicationContext. Другая содержит только основную процедуру. Я привел пример с формой и уведомлением, который при двойном щелчке вызывает форму и обратно.

Не забудьте установить "Sub Main" в качестве объекта запуска в настройках "Мой проект" и указать реальный файл *.ico вместо f:\TP.ico..:)

Конечно, код должен быть заполнен надлежащим кодом обработки ошибок.

Class1:

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 

Class2:

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

Это показывает, как управлять запуском как сведенным к минимуму, так и нормальным, а также намного больше с NotifyIcon.

Подробнее здесь: http://code.msdn.microsoft.com/TheNotifyIconExample