мінімізувати додаток до системного трея


114

У мене є додаток для форм Windows для роботи на C # та Visual Studio 2010.

Як я можу мінімізувати додаток до системного треї (не панелі завдань), а потім повернути його назад, коли подвійне клацання в системному треї? будь-яка ідея? також, як я можу скласти якесь меню з піктограми в системному треї, і коли я клацнув правою кнопкою миші, воно показує таке меню, як Увійти, Відключити, З'єднати, щось подібне. Крім того, чи є якісь способи показувати, як повітряна куля вискакує з системного трея?

PS: Я вже додав notifyIcon, але не знаю, як ним користуватися.


Тут ви можете завантажити чудовий зразок коду simple-talk.com/dotnet/.net-framework/…
Розробник

Ви хочете переконатися, що ви перейдете до Designer.cs форми та "зареєструєте" обробник подій, інакше нічого з цього не вийде (я не міг цього зрозуміти). Ви можете зробити це, додавши щось подібне: this.Resize + = new System.EventHandler (this.ManagementForm_Resize);
Бред

Відповіді:


149

Обробіть подію зміни розміру форми. У цьому оброблювачі ви переосмислюєте основну функціональність події Resize, щоб мінімізувати форму в системному треї, а не на панелі завдань. Це можна зробити, виконавши наступне в обробнику події зміни розміру вашої форми: Перевірте, чи властивість WindowState форми встановлено на FormWindowState.Minimized. Якщо так, прихойте форму, увімкніть об’єкт NotifyIcon та покажіть підказку на повітряній кулі, яка містить деяку інформацію. Як тільки WindowState стає FormWindowState.Normal, відключіть об'єкт NotifyIcon, встановивши його властивість Visible на false. Тепер ви хочете, щоб вікно знову з’явилося, коли ви двічі клацніть об’єкт NotifyIcon на панелі завдань. Для цього обробіть події MouseDoubleClick NotifyIcon. Тут ви показуєте форму за допомогою методу Show ().

private void frmMain_Resize(object sender, EventArgs e)
{
    if (FormWindowState.Minimized == this.WindowState)
    {
       mynotifyicon.Visible = true;
       mynotifyicon.ShowBalloonTip(500);
       this.Hide();
    }

    else if (FormWindowState.Normal == this.WindowState)
    {
       mynotifyicon.Visible = false;
    }
}

5
ви можете змінити властивість Form.FormBorderStyle msdn.microsoft.com/en-us/library/…
CD ..

tnx! він працював .. також будь-яка ідея відключити ці мінімізувати, закривати, максимізувати кнопки вгорі праворуч? tnx
WantIt


tnx це також працювало! Крім того, коли я двічі клацну піктограму в системному треї, вікно не знаходиться на вершині інших програм, я повинен докласти зусиль, натиснувши вікно на панелі завдань, щоб воно з’явилося. Як ми можемо це впоратися? tnx so much
WantIt


69

Я знайшов це для досягнення всього рішення. Відповідь вище не вдається видалити вікно з панелі завдань.

private void ImportStatusForm_Resize(object sender, EventArgs e)
{
    if (this.WindowState == FormWindowState.Minimized)
    {
        notifyIcon.Visible = true;
        notifyIcon.ShowBalloonTip(3000);
        this.ShowInTaskbar = false;
    }
}

private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e)
{
    this.WindowState = FormWindowState.Normal;
    this.ShowInTaskbar = true;
    notifyIcon.Visible = false;
}

Також добре встановити наступні властивості управління піктограмою сповіщення за допомогою конструктора форм.

this.notifyIcon.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Info; //Shows the info icon so the user doesn't think there is an error.
this.notifyIcon.BalloonTipText = "[Balloon Text when Minimized]";
this.notifyIcon.BalloonTipTitle = "[Balloon Title when Minimized]";
this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon"))); //The tray icon to use
this.notifyIcon.Text = "[Message shown when hovering over tray icon]";

7
Ви пропали this.Show();ранішеthis.WindowState = FormWindowState.Normal;
developerwjk

1
Введіть текст "користувач не має нічого". ;)
Андрій

1
@developerwjk, це не пропущено, оскільки він не дзвонить Hide(). Але проблема такого підходу полягає в тому, що вікно все ще з’являється, коли ви натискаєте Alt-Tab. Я вважаю за краще телефонувати, Hide()і таким чином вам взагалі не потрібно використовувати ShowInTaskbarмайно.
Андрій

@Andrew У мене виникають проблеми під час використання Show()та Hide(); після сховання, показування, а потім сховання він більше не відображатиметься.
newbieguy

@newbieguy, я думаю, вам потрібно створити нове запитання, оскільки ваша проблема не дуже підходить для коментаря до відповіді. Вам потрібно буде надати більше інформації, як код, який ви використовуєте. Ви можете включити посилання на відповідь, яку ви намагалися використати.
Andrew

17

Я б пішов з

private void Form1_Resize(object sender, EventArgs e)
{
     if (FormWindowState.Minimized == this.WindowState)
     {
          notifyIcon1.Visible = true;
          notifyIcon1.ShowBalloonTip(500);
          this.Hide();    
     }
     else if (FormWindowState.Normal == this.WindowState)
     {
          notifyIcon1.Visible = false;
     }
}

private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
{
     this.Show();
     this.WindowState = FormWindowState.Normal;
}

17

не забудьте додати файл значка до свого notifyIcon, інакше він не з’явиться в лотку.


найпотрібніша частина теми. Чи можете ви додати трохи більше інформації, як змусити її використовувати піктограму за замовчуванням?
Т.Тодуа

12

спробуйте це

 private void Form1_Load(object sender, EventArgs e)
    {
        notifyIcon1.BalloonTipText = "Application Minimized.";
        notifyIcon1.BalloonTipTitle = "test";
    }

    private void Form1_Resize(object sender, EventArgs e)
    {
        if (WindowState == FormWindowState.Minimized)
        {
            ShowInTaskbar = false;
            notifyIcon1.Visible = true;
            notifyIcon1.ShowBalloonTip(1000);
        }
    }

    private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        ShowInTaskbar = true;
        notifyIcon1.Visible = false;
        WindowState = FormWindowState.Normal;
    }

1
Якщо ви просто ховаєтеся на панелі завдань замість дзвінка this.Hide(), вікно все одно з’явиться під час виконання Alt-Tab.
Андрій

3

Це метод, який я використовую у своїх програмах, він досить простий і зрозумілий, але я рада надати більше деталей у відповідь на ваші коментарі.

    public Form1()
    {
        InitializeComponent();

        // When window state changed, trigger state update.
        this.Resize += SetMinimizeState;

        // When tray icon clicked, trigger window state change.       
        systemTrayIcon.Click += ToggleMinimizeState;
    }      

    // Toggle state between Normal and Minimized.
    private void ToggleMinimizeState(object sender, EventArgs e)
    {    
        bool isMinimized = this.WindowState == FormWindowState.Minimized;
        this.WindowState = (isMinimized) ? FormWindowState.Normal : FormWindowState.Minimized;
    }

    // Show/Hide window and tray icon to match window state.
    private void SetMinimizeState(object sender, EventArgs e)
    {    
        bool isMinimized = this.WindowState == FormWindowState.Minimized;

        this.ShowInTaskbar = !isMinimized;           
        systemTrayIcon.Visible = isMinimized;
        if (isMinimized) systemTrayIcon.ShowBalloonTip(500, "Application", "Application minimized to tray.", ToolTipIcon.Info);
    }

2
У цього та інших рішень є одне питання: якщо форма прихована під іншими вікнами, користувач, швидше за все, не хоче її мінімізувати при натисканні на іконку. Натомість слід зосередитись. Дивіться моє запитання тут: stackoverflow.com/questions/36797442/…
maf-soft

1

Натиснувши на зображення в системному треї, ви можете переконатися, що кадр видно, і тоді вам доведеться встановити Visible = true або false


1

... а для меню сповіщень правою кнопкою миші додайте у форму контекстне меню та відредагуйте його та встановіть події мишею клацання для кожного з контекстних меню, подвійним клацанням на них, а потім додайте їх до notifyicon1, вибравши ContextMenuStrip у властивості notifyicon.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.