2013-07-16 5 views
4

У меня есть приложение, которое я не хочу показывать на панели задач. Когда приложение сведено к минимуму, оно сводится к SysTray.Минимизированное приложение, отображающееся над панелью задач

Проблема заключается в том, что при установке ShowInTaskbar = false сведенная к минимуму заявка показывает выше панели задач, просто откройте кнопку запуска Windows 7. Если я установил ShowInTaskbar = true, приложение будет сведено к минимуму, но, очевидно, приложение отобразится на панели задач.

Любая идея, почему это происходит и как я могу это исправить?

Failure to minimize

EDIT: Для ясности, вот код, я использую:

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

    private void btnDisable_Click(object sender, EventArgs e) 
    { 

     // Minimize to the tray 
     notifyIcon1.Visible = true; 
     WindowState = FormWindowState.Minimized; // Minimize the form 
    } 
+0

возможно дубликат [Как начать WinForm приложение минимизировано в лоток?] (http://stackoverflow.com/questions/1730731/how-to-start-winform-app-minimized-to-tray) –

+0

Хорошо, это был выстрел в ковчег, но я удалил Form_Res ize, запустил приложение, затем добавил событие изменения размера (используя тот же код) и, похоже, теперь работает. – mack

ответ

3

Нет обработчика событий, который бы установил, когда был запрошен запрос минимизации формы. Таким образом, чтобы «попасть в» перед тем форма была сведена к минимуму, вам придется внедриться в процедуре WndProc

private const int WM_SYSCOMMAND = 0x0112; 
private const int SC_MINIMIZE = 0xF020; 

[SecurityPermission(SecurityAction.LinkDemand, 
        Flags = SecurityPermissionFlag.UnmanagedCode)] 
protected override void WndProc(ref Message m) 
{ 
    switch(m.Msg) 
    { 
     case WM_SYSCOMMAND: 
      int command = m.WParam.ToInt32() & 0xfff0; 
      if (command == SC_MINIMIZE && this.minimizeToTray) 
      { 
       PerformYourOwnOperation(); // For example 
      } 
      break; 
    } 
    base.WndProc(ref m); 
} 

, а затем вы можете просто скрыть форму в PerformYourOwnOperation(); методе

public void PerformYourOwnOperation() 
{ 
    Form form = GetActiveForm(); 
    form.Hide(); 
} 

Затем вам понадобится какой-то механизм для Show() скрытой формы, иначе он будет потерян.

Другой способ - использовать событие изменения размера формы. Тем не менее, это срабатывает после форма сводится к минимуму. Для этого вы можете сделать что-то вроде

private void Form_Resize(object sender, EventArgs e) 
{ 
    if (WindowState == FormWindowState.Minimized) 
    { 
     // Do some stuff. 
    } 
} 

Надеюсь, это поможет.

+1

Спасибо Kc. Я использовал событие Form_Resize. Мне пришлось отключить событие, запустить приложение, а затем добавить событие обратно, и оно работает. – mack

+0

Прохладный, рад, что я мог бы помочь. :] – MoonKnight

3

Я думаю, что вы должны также скрыть окно. Для того, чтобы получить такое поведение в WPF, я должен сделать следующее:

WindowState = WindowState.Minimized; 
Visibility = Visibility.Hidden; 
ShowInTaskbar = false; 

Поскольку WPF и WinForms и в конечном счете сводятся к Win32 окна, вы, вероятно, придется делать то же самое.

1

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

Вот как посмотреть событие изменения размера окна.

How to detect when a windows form is being minimized?

Вот учебник для использования NotifyIcon предоставленный CodeProject. NotifyIcon является элементом форм Windows, поэтому он все равно будет работать в вашем приложении.

http://www.codeproject.com/Articles/36468/WPF-NotifyIcon

0

Вот один из самых простых решений (я так думаю):

//Deactivate event handler for your form. 
private void Form1_Deactivate(object sender, EventArgs e) 
{ 
    if (WindowState == FormWindowState.Minimized) Hide(); 
} 
0

Добавить обработчик для изменения размера:

private void Form1_Resize(object sender, EventArgs e) 
{ 
    Visible = WindowState != FormWindowState.Minimized; 
} 
Смежные вопросы