简而言之,我想创建一个占据整个屏幕并始终留在后台的背景窗体,而不会将弹出的任何其他应用程序窗体在创建时设置为其子窗体。
我有一个偶尔维护的WinForms应用程序,它需要很多架构上的改进。这是一个触摸屏kiosk应用。它将在未来得到一些严肃的关注,但现在,我需要把它贴上创可贴。
问题是,该应用程序设计的窗口来来去去,没有其他窗口是子窗口的主窗口。所有的东西都是多线程的,因为它会响应来自不同来源的大量事件。此外,一切都是令人困惑的Castle-Windsor化,这使得所有的更改都有问题,缺陷成倍增加。
因此,出现的一些“对话框”不在对话模式中,没有父级,也没有占据整个屏幕。我猜它在测试中没有被发现,因为有时以前的窗口会停留在那里,有时由于事件处理中的一些bug而不会。系统中有许多潜在的bug和设计缺陷,所以当我对其进行过多的干扰时,事情就会崩溃。
这意味着有时桌面会变得可见(比如在对话框的边缘没有设置为全屏,当之前的表单被正确处理时),这意味着操作员可以上网浏览色情内容或其他东西。
我制作了一个可以工作的表单,并在大多数相关事件(只调用SendToBack())上设置了一个事件处理程序,如果它们发生了-就像焦点或鼠标单击之类的事件。
我担心这不会捕捉到所有内容,用户会看到这个空白的灰色表单,什么也不做(如果他们点击它,它就会转到后面)。
有没有一种保证的方法来强制这个表单留在后台?
发布于 2011-08-14 06:46:41
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; }
}
}https://stackoverflow.com/questions/7045524
复制相似问题