【问题标题】:C# - Window always on top problemC# - 窗口总是在最上面的问题
【发布时间】:2011-06-24 18:48:00
【问题描述】:

所以我正在制作一个叠加层,我需要它始终位于顶部。为此,我只需设置

chackBox1.checked = true;

private void checkChanged(object sender, EventArgs e)
{
        this.TopMost = checkBox1.Checked;
}  

正如许多地方所建议的那样。这里的问题是 1)我需要一个复选框按钮...但这不是问题,我可以设置为 Visible = false。 2)在我用鼠标手动选中该框之前,它永远不会起作用!即使我将它设置为选中,设置 form1.isTopMost = true(在 initComponents 之后)并调用 checkChanged 事件,我总是必须手动选中该框,然后它才会始终保持在顶部!

请帮忙!如何使叠加层始终加载在顶部?

我的下一步是创建一个线程来强制表单保持在顶部,但我想避免这种 LOL

谢谢,

戴夫

【问题讨论】:

  • 为什么不在表单的属性检查器中设置 TopMost 并删除复选框?
  • 我对物业检查员不熟悉,你能告诉我更多细节吗?我使用了复选框控件,因为这是所有示例都使用的
  • @David:他指的是Visual Studio中控件的属性。
  • 我试过了,结果一样
  • @David:在设置 TopMost = true 之后在 TopMost 表单上调用 .Show() 怎么样?

标签: c# winforms forms overlay always-on-top


【解决方案1】:

getfocuslostfocus 上设置Topmost = true 显然有效,直到您正在运行的某个EXE 弹出一个消息框,单击弹出消息框的顶部栏会将您的窗口带到背景。

试试这个,一个非常可靠的方法:

namespace WindowsFormsApplication52
{
    public partial class Form1 : Form
    {
        static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
        static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
        static readonly IntPtr HWND_TOP = new IntPtr(0);
        static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
        const UInt32 SWP_NOSIZE = 0x0001;
        const UInt32 SWP_NOMOVE = 0x0002;
        const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE;

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);
        }
    }
}

【讨论】:

    【解决方案2】:

    还有其他问题。每当属性值发生更改时,这些属性更改事件就会触发,无论这是由您的代码、控件自己的代码还是数据绑定完成的。如果已选中,则在复选框状态更改之前,它可能不会触发处理程序。

    当您以编程方式将 checkBox1 设置为 true 或手动选中复选框时,您应该在 checkChanged(..) 事件中触发 MessageBox 以显示。这将有助于调试。由于 checkChanged 不是此类事件的典型默认名称,我猜测您更改了它,因此它可能完全指向不同的事件处理函数。

    【讨论】:

      【解决方案3】:

      好吧,伙计们!感谢大家的帮助,0A0D既然触发了,我就给答案!

      我在窗口的焦点和非焦点事件上都设置了 TopMost = true,并在初始化后使用 .Focus() 和 .Show,一切似乎都正常!

      谢谢!

      【讨论】:

      • 我很感激接受,但你的接受是修复它的那个。我很高兴无论哪种方式都能提供帮助。
      猜你喜欢
      • 1970-01-01
      • 2015-03-08
      • 2011-06-08
      • 1970-01-01
      • 2023-01-09
      • 2021-08-25
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      相关资源
      最近更新 更多