C# - 窗口始终存在问题

时间:2011-06-24 18:48:01

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

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

chackBox1.checked = true;

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

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

请帮忙!如何制作它以使叠加层始终位于顶部?

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

谢谢,

戴夫

3 个答案:

答案 0 :(得分:2)

Topmost = truegetfocus上设置lostfocus可以正常工作,直到您正在运行的某个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);
        }
    }
}

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

好的伙计们!感谢您的帮助,我会在触发它之后给出答案0A0D!

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

谢谢!