WinForms - 尝试使背景最大化的形式保持在后台并且不响应

时间:2011-08-12 19:45:24

标签: .net winforms

简而言之,我想制作一个背景形式,它占据整个屏幕并始终保持在后面 - 无需设置任何其他应用程序表单,这些表单在创建时会弹出设置为其子项。

我有一个WinForms应用程序我偶尔会维护它需要很多架构改进。这是一个触摸屏自助服务终端应用程序。它将来会得到一些认真的关注,但是现在,我需要在它上面放一个创可贴。

问题是该应用程序设计的窗口来来往往,并没有其他窗口是其子窗口的主窗口。一切都是多线程的,因为它响应了来自不同来源的很多事件。此外,一切都令人困惑的城堡 - 温莎化,这使得所有变化都成为问题和缺陷倍增。

所以出现的一些“对话框”不是在对话框模式下,没有父母,也没有像他们应该那样占据全屏。而且我猜测它没有在测试中被选中,因为有时先前的窗户会粘在一起,有时它们不会由于事件处理中的一些错误而导致。系统中存在很多潜在的错误和设计缺陷,所以当我破坏它时,事情就会破裂。

这意味着有时桌面变得可见(就像对话框的边缘没有设置为全屏,当以前挥之不去的表格被妥善处理时),这意味着操作员可以上网和冲浪色情片等等。

我创建了一个可以工作的表单,并且我在大多数相关事件(只调用SendToBack())上设置了一个事件处理程序(如果它们发生) - 如焦点或鼠标点击或其他任何事情。

我担心这不会捕捉到所有内容,用户会看到这个空白的灰色表单并且什么都不做(如果他们点击它,它会转到后面)。

是否有保证强制此表单留在后台的方法?

1 个答案:

答案 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; }
    }

}