首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WinForms -尝试创建一个背景最大化的表单,该表单停留在后台,没有响应

WinForms -尝试创建一个背景最大化的表单,该表单停留在后台,没有响应
EN

Stack Overflow用户
提问于 2011-08-13 03:45:24
回答 1查看 296关注 0票数 3

简而言之,我想创建一个占据整个屏幕并始终留在后台的背景窗体,而不会将弹出的任何其他应用程序窗体在创建时设置为其子窗体。

我有一个偶尔维护的WinForms应用程序,它需要很多架构上的改进。这是一个触摸屏kiosk应用。它将在未来得到一些严肃的关注,但现在,我需要把它贴上创可贴。

问题是,该应用程序设计的窗口来来去去,没有其他窗口是子窗口的主窗口。所有的东西都是多线程的,因为它会响应来自不同来源的大量事件。此外,一切都是令人困惑的Castle-Windsor化,这使得所有的更改都有问题,缺陷成倍增加。

因此,出现的一些“对话框”不在对话模式中,没有父级,也没有占据整个屏幕。我猜它在测试中没有被发现,因为有时以前的窗口会停留在那里,有时由于事件处理中的一些bug而不会。系统中有许多潜在的bug和设计缺陷,所以当我对其进行过多的干扰时,事情就会崩溃。

这意味着有时桌面会变得可见(比如在对话框的边缘没有设置为全屏,当之前的表单被正确处理时),这意味着操作员可以上网浏览色情内容或其他东西。

我制作了一个可以工作的表单,并在大多数相关事件(只调用SendToBack())上设置了一个事件处理程序,如果它们发生了-就像焦点或鼠标单击之类的事件。

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

有没有一种保证的方法来强制这个表单留在后台?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-14 06:46:41

代码语言:javascript
复制
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; }
    }

}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7045524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档