0

所以我正在做一个覆盖,我需要它总是在上面。为此,我只是设置

chackBox1.checked = true;

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

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

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

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

谢谢,

戴夫

4

3 回答 3

2

设置并明显Topmost = true地工作,直到您从正在运行的某个 EXE 中弹出一个消息框,单击弹出消息框的顶部栏将使您的窗口进入背景。getfocuslostfocus

试试这个,一个非常强大的方法来实现这一点:

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);
        }
    }
}
于 2012-09-12T06:43:36.233 回答
1

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

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

于 2011-06-24T18:53:59.157 回答
0

好了朋友们!谢谢大家的帮助,0A0D既然触发了,我就给答案!

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

谢谢!

于 2011-06-24T19:04:42.237 回答