简而言之,我想制作一个背景形式,它占据整个屏幕并始终保持在后面 - 无需设置任何其他应用程序表单,这些表单在创建时会弹出设置为其子项。
我有一个WinForms应用程序我偶尔会维护它需要很多架构改进。这是一个触摸屏自助服务终端应用程序。它将来会得到一些认真的关注,但是现在,我需要在它上面放一个创可贴。
问题是该应用程序设计的窗口来来往往,并没有其他窗口是其子窗口的主窗口。一切都是多线程的,因为它响应了来自不同来源的很多事件。此外,一切都令人困惑的城堡 - 温莎化,这使得所有变化都成为问题和缺陷倍增。
所以出现的一些“对话框”不是在对话框模式下,没有父母,也没有像他们应该那样占据全屏。而且我猜测它没有在测试中被选中,因为有时先前的窗户会粘在一起,有时它们不会由于事件处理中的一些错误而导致。系统中存在很多潜在的错误和设计缺陷,所以当我破坏它时,事情就会破裂。
这意味着有时桌面变得可见(就像对话框的边缘没有设置为全屏,当以前挥之不去的表格被妥善处理时),这意味着操作员可以上网和冲浪色情片等等。
我创建了一个可以工作的表单,并且我在大多数相关事件(只调用SendToBack())上设置了一个事件处理程序(如果它们发生) - 如焦点或鼠标点击或其他任何事情。
我担心这不会捕捉到所有内容,用户会看到这个空白的灰色表单并且什么都不做(如果他们点击它,它会转到后面)。
是否有保证强制此表单留在后台的方法?
答案 0 :(得分:4)
public partial class BackgroundForm : Form
{
const int WM_MOUSEACTIVATE = 0x21;
const int MA_NOACTIVATEANDEAT = 0x0004;
public BackgroundForm()
{
InitializeComponent();
ShowInTaskbar = false;
}
protected override void DefWndProc(ref Message m)
{
if (m.Msg == WM_MOUSEACTIVATE)
{
m.Result = (IntPtr) MA_NOACTIVATEANDEAT;
return;
}
base.DefWndProc(ref m);
}
protected override bool ShowWithoutActivation
{
get { return true; }
}
}