我想在屏幕上显示主要表单上的信息消息。
我遇到的问题是我不希望将其作为新表单在Windows中注册,因为在应用程序之间切换时会显示在任务栏中。我有很多这些信息框弹出来通知你事件。
这个想法是它应该像对话框一样工作(不要注册为独立的表单),除了它不希望你与对话框交互。
到目前为止,我使用以下内容:
exec("self."+string+"="+value)
任何人都可以指出如何防止此窗口被注册为独立窗口
编辑:感谢您建议的链接@ shf301: Best way to hide a window from the Alt-Tab program switcher?
我看了一眼,但这是无关紧要的。该链接说明了如何从alt-tab菜单中隐藏应用程序。在这个例子中,我不想隐藏我的应用程序,我只想显示弹出窗口而不将它们注册为新窗口。
答案 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)控件。您也可以通过自定义绘制内容来自定义视觉效果。