【问题标题】:Window on desktop / bottom-most window in winforms桌面上的窗口/winforms 中最底部的窗口
【发布时间】:2011-11-04 16:36:01
【问题描述】:

我正在尝试在启动时启动一个表单,并让它在我的应用程序运行的整个过程中一直作为背景。本质上,我想隐藏所有桌面图标并拥有空白背景。此外,当用户单击某些按钮时,我希望表单 BackColor 发生变化。

我已经搜索了一堆,我一直在寻找一半的解决方案。到目前为止,这是我尝试过的:

创建了一个覆盖 WndProc 事件的 BackBaseForm,如果它是 WM_WINDOWPOSCHANGING,我不调用 base.WndProc(ref m),而是发送以下消息:

SetWindowPos(Handle, new IntPtr(1), 0, 0, this.width, this.height, SWP_NOZORDER);

但是,每当我单击表单时,它仍会将其置于最前面。我还尝试创建一个WINDOWPOS 结构,编组指向该结构的指针,然后修改该结构。我不认为这会改变消息中实际的lParam

【问题讨论】:

    标签: c# winforms winforms-interop


    【解决方案1】:

    创建背景表单并将“主”表单的所有者表单设置为该背景表单。例如:

    frmBackground backgroundForm = new frmBackground();
    frmMain mainForm = new frmMain();
    mainForm.Owner = backgroundForm;
    backgroundForm.Show();
    mainForm.Show();
    

    【讨论】:

    • 将会有许多表单从几个不同的程序集启动,这适用吗?
    • 表单类在哪个程序集中并不重要,只要所有窗口都在同一个进程中。即使在不同的进程中你应该能够做到这一点,但你需要使用一些较低级别的 Win32 API 调用。
    【解决方案2】:

    frmBackground.Enabled 设置为 false。

    在你的主窗体中:

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
    
            var bg = new Form();
            bg.WindowState = FormWindowState.Maximized;
            bg.ShowInTaskbar = false;
            bg.FormBorderStyle = FormBorderStyle.None;
            bg.Show();
            bg.Enabled = false;
            this.Owner = bg; // optional - see below
        }
    

    如果你这样做:

    this.Owner = f; 
    

    然后当你点击背景表单时你的主表单边框会闪烁(至少在Windows 7中,我不确定其他版本)。无论哪种方式,将 Enabled 设置为 false 都可以。但是当您单击背景表单时会发出哔哔声,这可能很烦人。可能有一些方法可以防止它。

    【讨论】:

      猜你喜欢
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-14
      相关资源
      最近更新 更多