Поместите программу в системный лоток при запуске
Я следил за общим соединением для сокращения приложения в системном лотке: http://www.developer.com/net/csharp/article.php/3336751 Теперь он работает, но есть еще проблема: мое приложение отображается, когда оно начинается; Я хочу, чтобы он начинался прямо в systray. Я попытался свести к минимуму и скрыть его в событии Load, но ничего не делает.
Изменить: я мог бы, как предложил плакат, изменить свойства ярлыка, но я бы предпочел использовать код: у меня нет полного контроля над каждым компьютером, на котором установлена программа.
Я не хочу полностью удалять его извне, кроме systray, я просто хочу, чтобы он был сведен к минимуму.
Любые идеи?
Спасибо
Ответы
Ответ 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);
Ответ 4
Как небольшая часть, вы можете настроить ярлык, который запускает ваше приложение, чтобы "выполнить минимизацию"? Это может дать вам то, что вам нужно!
Так же: (изображение просто пример из google)...
Запустить Минимизированный http://www.unixwiz.net/images/ygpm-shortcut-4.gif
Ответ 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