2015-05-03 4 views
1

Я хотел бы отображать информационные сообщения на экране, по моей основной форме.Всплывающее окно winforms (но не зарегистрированное как новое отдельное окно)

Проблема заключается в том, что я не хочу, чтобы это было зарегистрировано в Windows как новая форма, так как это отображается на панели задач при переключении между приложениями. У меня появилось много таких информационных полей, чтобы сообщать вам о событиях.

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

До сих пор я использую следующий:

var notification = new Notification(); 
notification.ShowInTaskbar = false; 
notification.Show(); 

Может кто-нибудь, пожалуйста, указать, как вы можете предотвратить это окно от регистрации в качестве автономного окна

EDIT: Спасибо за предложенную ссылку @ shf301: Best way to hide a window from the Alt-Tab program switcher?

Я посмотрел на него, но это не связано. Ссылка объясняет, как скрыть приложение из меню alt-tab. В этом примере я не хочу скрывать свое приложение, я просто хочу показывать всплывающие окна, без регистрации их в качестве новых окон.

+0

вы можете использовать MDI форм ?? –

+0

Попробуйте передать 'this' методу' Show() '. –

+0

Возможный дубликат [Лучший способ скрыть окно от переключателя программ Alt-Tab?] (Http://stackoverflow.com/questions/357076/best-way-to-hide-a-window-from-the-alt -tab-program-switcher) – shf301

ответ

1

Это не так просто, потому что в основном всплывающие окна не поддерживаются в Windows Forms. Хотя формы окон основаны на win32 и в win32 всплывающие окна поддерживаются. Если вы примете несколько трюков, следующий код установит вас со всплывающим окном. Вы сами решаете, если вы хотите поставить его с пользой: (Это так, например, всплывающие подсказки сделаны)

class PopupWindow : Control 
{ 
    private const int WM_ACTIVATE = 0x0006; 
    private const int WM_MOUSEACTIVATE = 0x0021; 

    private Control ownerControl; 

    public PopupWindow(Control ownerControl) 
     :base() 
    { 
     this.ownerControl = ownerControl; 
     base.SetTopLevel(true); 
    } 

    public Control OwnerControl 
    { 
     get 
     { 
      return (this.ownerControl as Control); 
     } 
     set 
     { 
      this.ownerControl = value; 
     } 
    } 

    protected override CreateParams CreateParams 
    { 
     get 
     { 
      CreateParams createParams = base.CreateParams; 

      createParams.Style = WindowStyles.WS_POPUP | 
           WindowStyles.WS_VISIBLE | 
           WindowStyles.WS_CLIPSIBLINGS | 
           WindowStyles.WS_CLIPCHILDREN | 
           WindowStyles.WS_MAXIMIZEBOX | 
           WindowStyles.WS_BORDER; 
      createParams.ExStyle = WindowsExtendedStyles.WS_EX_LEFT | 
            WindowsExtendedStyles.WS_EX_LTRREADING | 
            WindowsExtendedStyles.WS_EX_RIGHTSCROLLBAR | 
            WindowsExtendedStyles.WS_EX_TOPMOST; 

      createParams.Parent = (this.ownerControl != null) ? this.ownerControl.Handle : IntPtr.Zero; 
      return createParams; 
     } 
    } 

    [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] 
    public static extern IntPtr SetActiveWindow(HandleRef hWnd); 

    protected override void WndProc(ref Message m) 
    { 
     switch (m.Msg) 
     { 
      case WM_ACTIVATE: 
       { 
        if ((int)m.WParam == 1) 
        { 
         //window is being activated 
         if (ownerControl != null) 
         { 
          SetActiveWindow(new HandleRef(this, ownerControl.FindForm().Handle)); 
         } 
        } 
        break; 
       } 
      case WM_MOUSEACTIVATE: 
       { 
        m.Result = new IntPtr(MouseActivate.MA_NOACTIVATE); 
        return; 
        //break; 
       } 
     } 
     base.WndProc(ref m); 
    } 

    protected override void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     e.Graphics.FillRectangle(SystemBrushes.Info, 0, 0, Width, Height); 
     e.Graphics.DrawString((ownerControl as VerticalDateScrollBar).FirstVisibleDate.ToLongDateString(), this.Font, SystemBrushes.InfoText, 2, 2); 
    } 
} 

Эксперимент с ним немного, вы должны играть с его положением и его размер. Используйте это неправильно и ничего не показывает.

+0

Спасибо Филиппу за быстрый и отличный ответ. Любой, кто его использует. См. Мое сообщение ниже для дополнительного кода. – z0mbi3

2

Единственный способ, которым я знаю, показать окно внутри программы (без его появления на панели задач) - использовать интерфейс нескольких документов (MDI). Это несколько сложно, но вы можете точно выполнить нужную задачу: показ окна в окне.

Более подробная информация о МДИ в .NET: http://csharp.net-informations.com/gui/cs-mdi-form.htm

+0

Спасибо, я знаю о MDI-окнах, но это не вариант в моем случае. – z0mbi3

0

Если эти уведомления вы ищете для поддержки взаимодействия с пользователем, вы можете рассмотреть возможность отображения всплывающего окна с использованием управления ToolStripDrownDown и размещения в нем элемента управления ToolStripControlHost.

Или они должны отображать информацию без вмешательства пользователя, используя управление Tooltip (с воздушным шаром = true). Вы также можете настроить его визуальные эффекты, используя собственный контент.

1

@ Ответ Филиппа правильный.

я должен был добавить следующее:

internal class WindowsExtendedStyles 
    { 

     public const int WS_EX_DLGMODALFRAME = 0x00000001; 

     public const int WS_EX_NOPARENTNOTIFY = 0x00000004; 

     public const int WS_EX_TOPMOST = 0x00000008; 

     public const int WS_EX_ACCEPTFILES = 0x00000010; 

     public const int WS_EX_TRANSPARENT = 0x00000020; 

     public const int WS_EX_MDICHILD = 0x00000040; 

     public const int WS_EX_TOOLWINDOW = 0x00000080; 

     public const int WS_EX_WINDOWEDGE = 0x00000100; 

     public const int WS_EX_CLIENTEDGE = 0x00000200; 

     public const int WS_EX_CONTEXTHELP = 0x00000400; 

     public const int WS_EX_RIGHT = 0x00001000; 

     public const int WS_EX_LEFT = 0x00000000; 

     public const int WS_EX_RTLREADING = 0x00002000; 

     public const int WS_EX_LTRREADING = 0x00000000; 

     public const int WS_EX_LEFTSCROLLBAR = 0x00004000; 

     public const int WS_EX_RIGHTSCROLLBAR = 0x00000000; 

     public const int WS_EX_CONTROLPARENT = 0x00010000; 

     public const int WS_EX_STATICEDGE = 0x00020000; 

     public const int WS_EX_APPWINDOW = 0x00040000; 

     public const int WS_EX_OVERLAPPEDWINDOW = WS_EX_WINDOWEDGE | WS_EX_CLIENTEDGE; 

     public const int WS_EX_PALETTEWINDOW = WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW | WS_EX_TOPMOST; 

     public const int WS_EX_LAYERED = 0x00080000; 

     public const int WS_EX_NOINHERITLAYOUT = 0x00100000; // Disable inheritence of mirroring by children 

     public const int WS_EX_LAYOUTRTL = 0x00400000; // Right to left mirroring 

     public const int WS_EX_COMPOSITED = 0x02000000; 

     public const int WS_EX_NOACTIVATE = 0x08000000; 

    } 

    internal class MouseActivate 
    { 

     public const int MA_ACTIVATE = 1; 

     public const int MA_ACTIVATEANDEAT = 2; 

     public const int MA_NOACTIVATE = 3; 

     public const int MA_NOACTIVATEANDEAT = 4; 

    }