winforms弹出窗口(但未注册为新的独立窗口)

时间:2015-05-03 19:08:24

标签: c# winforms

我想在屏幕上显示主要表单上的信息消息。

我遇到的问题是我不希望将其作为新表单在Windows中注册,因为在应用程序之间切换时会显示在任务栏中。我有很多这些信息框弹出来通知你事件。

这个想法是它应该像对话框一样工作(不要注册为独立的表单),除了它不希望你与对话框交互。

到目前为止,我使用以下内容:

exec("self."+string+"="+value)

任何人都可以指出如何防止此窗口被注册为独立窗口

编辑:感谢您建议的链接@ shf301: Best way to hide a window from the Alt-Tab program switcher?

我看了一眼,但这是无关紧要的。该链接说明了如何从alt-tab菜单中隐藏应用程序。在这个例子中,我不想隐藏我的应用程序,我只想显示弹出窗口而不将它们注册为新窗口。

4 个答案:

答案 0 :(得分:2)

我知道在程序中显示窗口(没有出现在任务栏中)的唯一方法是使用多文档界面(MDI)。这有点复杂,但可以完成您想要的任务:在窗口中显示一个窗口。

有关.NET中MDI的更多信息:http://csharp.net-informations.com/gui/cs-mdi-form.htm

答案 1 :(得分:1)

这并不容易,因为Windows窗体中不支持弹出窗口。虽然Windows窗体基于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);
    }
}

尝试一下,你必须玩它的位置和大小。使用它错误,没有任何显示。

答案 2 :(得分:1)

@ Philip的回答是正确的。

我必须添加以下内容:

    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;

    }

答案 3 :(得分:0)

如果您要查找此通知需要支持用户互动,则可以考虑使用ToolStripDrownDown控件显示弹出窗口并在ToolStripControlHost中托管控件。

或者他们只是想显示信息,没有用户交互,使用Tooltip(使用Balloon = true)控件。您也可以通过自定义绘制内容来自定义视觉效果。