设计类似MessageBox遇到的问题

鏡椛氹鈅 2015-12-23 05:55:25
在项目中需要自己设计类似于微软的MessageBox,整体已完成,但遇到以下几个问题:
1---当用户单击显示桌面在点击程序,消息窗体并不显示到主窗体前面,如下图:

该怎么解决...


2---用如下代码

public static MsgBoxResult Show(string msg, string title)
{
MainWindow msgBox =null ;
msgBox = new MainWindow();
msgBox.Title = title;
msgBox.Message = msg;
msgBox.ShowDialog();
return msgBox.BoxResult;
}

会导致任务管理器出现消息窗体的进程,如下图

怎么可以让消息窗体不出现在进程中

3---微软的MessageBox可以根据输入的信息动态改变消息窗体的大小,其实现原理是什么?
本人能力有限看不懂微软的源码,望大神给予解答
微软MessageBox的源码
...全文
203 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Poopaye 2015-12-24
  • 打赏
  • 举报
回复
我还是不懂你说的子窗体是什么,mdi? 我这样写的 Form1
namespace WindowsFormsApplication1
{
	public partial class Form1 : Form
	{
		public Form1()
		{
			InitializeComponent();
		}

		private void button1_Click(object sender, EventArgs e)
		{
			Form2.Show("", "");
		}
	}
}
Form2
namespace WindowsFormsApplication1
{
	public partial class Form2 : Form
	{
		public Form2()
		{
			InitializeComponent();
		}

		public static void Show(string msg, string title)
		{
			Form2 msgBox = null;
			msgBox = new Form2();
			msgBox.ShowDialog();
		}
	}
}
鏡椛氹鈅 2015-12-24
  • 打赏
  • 举报
回复
引用 8 楼 shingoscar 的回复:
什么叫做在子窗体内进行ShowDialog?
public static MsgBoxResult Show(string msg, string title) { MainWindow msgBox =null ; msgBox = new MainWindow(); msgBox.Title = title; msgBox.Message = msg; msgBox.ShowDialog(); return msgBox.BoxResult; } 这段代码是放在子窗体执行的, 主窗体只是调用Show这个函数...
Poopaye 2015-12-24
  • 打赏
  • 举报
回复
一样啊,还是不会跑到后面去
鏡椛氹鈅 2015-12-24
  • 打赏
  • 举报
回复
引用 12 楼 shingoscar 的回复:
https://img-bbs.csdn.net/upload/201512/24/1450937617_781762.jpg 你自己试试 另存为,改扩展名exe
WindowStyle="None" 把窗体边框去掉,在试试...
Poopaye 2015-12-24
  • 打赏
  • 举报
回复
https://img-bbs.csdn.net/upload/201512/24/1450937617_781762.jpg
你自己试试
另存为,改扩展名exe
鏡椛氹鈅 2015-12-24
  • 打赏
  • 举报
回复
引用 10 楼 shingoscar 的回复:
我还是不懂你说的子窗体是什么,mdi? 我这样写的 Form1
namespace WindowsFormsApplication1
{
	public partial class Form1 : Form
	{
		public Form1()
		{
			InitializeComponent();
		}

		private void button1_Click(object sender, EventArgs e)
		{
			Form2.Show("", "");
		}
	}
}
Form2
namespace WindowsFormsApplication1
{
	public partial class Form2 : Form
	{
		public Form2()
		{
			InitializeComponent();
		}

		public static void Show(string msg, string title)
		{
			Form2 msgBox = null;
			msgBox = new Form2();
			msgBox.ShowDialog();
		}
	}
}
你这样写From2不会跑到From1后面吗
Poopaye 2015-12-23
  • 打赏
  • 举报
回复
什么叫做在子窗体内进行ShowDialog?
鏡椛氹鈅 2015-12-23
  • 打赏
  • 举报
回复
引用 6 楼 shingoscar 的回复:
1. 原因不详,我自己试了下ShowDialog,死活都不会跑后面去 2. 窗体属性里ShowInTaskbar设为false即可 3. 你也可以根据输入内容来改变窗体大小啊,比如你设置label的Text,那它的size就会变化,然后。。。
1---你的代码一定是在主程序内进行ShowDialog而不是和我一样在子窗体内进行ShowDialog 2---我的ShowInTaskbar已经设置过了,仔细看下任务栏,没有出现在任务栏,但是会出现在任务管理器 3---具体的呢,窗体的大小会限制label,你不会告诉我通过label的大小来设置窗体的大小吧...
Poopaye 2015-12-23
  • 打赏
  • 举报
回复
1. 原因不详,我自己试了下ShowDialog,死活都不会跑后面去 2. 窗体属性里ShowInTaskbar设为false即可 3. 你也可以根据输入内容来改变窗体大小啊,比如你设置label的Text,那它的size就会变化,然后。。。
鏡椛氹鈅 2015-12-23
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
例如,你可以写
public static class abc
{
    public static void RegisterMessageBox(Form f)
    {
        f.Activated += (s, e) =>
        {
            MyMsgBox msg = GetMessageBoxWindow();
            if (msg != null && msg.正在显示)
            {
                msg.Focus();
            }
        };
    }

......................
}
}
然后在其它所有窗体的 Form_Load 方法中都调用它一次。
剩下的两个问题能给指点下吗?
鏡椛氹鈅 2015-12-23
  • 打赏
  • 举报
回复
引用 2 楼 sp1234 的回复:
例如,你可以写
public static class abc
{
public static void RegisterMessageBox(Form f)
{
f.Activated += (s, e) =>
{
MyMsgBox msg = GetMessageBoxWindow();
if (msg != null && msg.正在显示)
{
msg.Focus();
}
};
}

......................
}
}


然后在其它所有窗体的 Form_Load 方法中都调用它一次。

我明白你的意思,但实际上窗体没办法获取焦点

我用过窗体自带的LostFocus事件,用过API SetFoucs,拦截过上图的消息进行This.Foucs都不行,不过我刚刚把问题解决了
是通过SPy++看了下消息传递的情况,我拦截了WM_ACTIVATEAPP这个消息然后就达到了我要的效果
马少华 2015-12-23
  • 打赏
  • 举报
回复
1,showinco,showtaskbar都设成false就行了。 2,看不到实现,低层调用的Win32Api函数,SafeNativeMethods.MessageBox(new HandleRef(owner, handle), text, caption, style) 3,先测试要显示的文字宽度,再创建窗口。
  • 打赏
  • 举报
回复
例如,你可以写
public static class abc
{
    public static void RegisterMessageBox(Form f)
    {
        f.Activated += (s, e) =>
        {
            MyMsgBox msg = GetMessageBoxWindow();
            if (msg != null && msg.正在显示)
            {
                msg.Focus();
            }
        };
    }

......................
}
}
然后在其它所有窗体的 Form_Load 方法中都调用它一次。
  • 打赏
  • 举报
回复
你可以捕获窗体的“激活”事件,此时如果消息窗体应该显示,那么将焦点设置到消息窗体上。而且这可以是你所有窗体(除了消息窗体)的通用的行为,可以写为自己的一个公共static方法库中的通用方法。

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧