所以我正在制作叠加层,我需要它始终位于顶部。为此,我只需设置
chackBox1.checked = true;
private void checkChanged(object sender, EventArgs e)
{
this.TopMost = checkBox1.Checked;
}
正如许多地方所建议的那样。这里的问题是 1)我需要一个复选框按钮......但这不是一个问题,我可以设置为Visible = false。 2)它永远不会工作,直到我用鼠标手动检查框!即使我将其设置为选中,设置form1.isTopMost = true(在initComponents之后)并调用checkChanged事件,我总是必须手动选中该框,然后才能始终保持在最顶层!
请帮忙!如何制作它以使叠加层始终位于顶部?
我的下一步是创建一个强制表单保持在顶部的线程,但我想避免这个LOL
谢谢,
戴夫
答案 0 :(得分:2)
在Topmost = true
和getfocus
上设置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)
我在窗口的焦点和非焦点事件上都设置了TopMost = true,我在初始化后使用.Focus()和.Show,一切似乎都有效!
谢谢!