点击始终停留在顶部的可通读表单



我试图创建一个窗体,它总是在顶部是透明的,可点击的,并且纯粹用于绘制信息,永远不会失去焦点,所以它总是显示在顶部。这个想法是能够在我的屏幕上绘制信息,这些信息将不断出现在其他窗口的顶部,很可能只有简单的文本,但不妨碍我与其他程序交互,同时仍然可见。

我遇到的麻烦是让表单总是在最上面,尽管其他程序被关注。我试过使用TopMost属性,但这似乎不起作用,并发挥了窗口重新聚焦于不聚焦,但这似乎有点草率,不管怎样都不起作用。我用的是Windows 8.1。

您必须使用扩展的windows样式,下面的代码展示了如何做到这一点。

此窗体将鼠标交互传递给它后面的窗体,并且即使在其他TopMost窗口活动的情况下也会显示为TopMost。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    const int GWL_EXSTYLE = -20;
    const int WS_EX_TRANSPARENT = 0x20;
    [DllImport("user32.dll", CharSet=CharSet.Auto)]
    extern static int GetWindowLong(IntPtr hWnd, int nIndex);
    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    extern static int SetWindowLong(IntPtr hWnd, int nIndex, int nStyle);
    private void Form1_Load(object sender, EventArgs e)
    {
        var style = GetWindowLong(this.Handle, GWL_EXSTYLE);
        var newStyle = style | WS_EX_TRANSPARENT;
        SetWindowLong(this.Handle, GWL_EXSTYLE, newStyle);
    }
    private void timer1_Tick(object sender, EventArgs e)
    {
        this.BringToFront();
    }
}

这将是用户与表单交互的一个小技巧,你必须提供更多关于你想做什么的细节,这样我们才能帮助你。

显示你的窗口总是在顶部,放置一个定时器,间隔为100ms,并设置窗体属性TopMost为true。

最新更新