点击始终位于顶部的完整表单

时间:2014-05-14 19:02:07

标签: c# winforms overlay windows-8.1

我尝试创建一个始终位于顶部且透明,点击通过的表单,并且纯粹用于绘制永不丢失焦点的信息,因此始终显示在顶部。我的想法是能够在我的屏幕上绘制信息,这些信息将始终位于每个其他窗口的顶部,很可能只是简单的文本,但不会阻止我与其他程序交互,同时仍然可见。

我遇到的麻烦就是让表单始终处于最佳状态,尽管其他程序都是重点。我已经尝试过使用TopMost属性,但这似乎不起作用,并且已经玩过让窗口重新聚焦于不聚焦,但这似乎有点草率,无论如何都无法工作。我在Windows 8.1上是否重要。

非常感谢任何回复,谢谢。

1 个答案:

答案 0 :(得分:-1)

您必须使用扩展窗口样式,此代码显示如何执行此操作。

此表单将鼠标交互传递给其后面的表单,即使其他Top Most窗口处于活动状态,也会显示为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();
    }
}

用户与表单进行交互将是一个小技巧,您必须提供有关您尝试做的更多详细信息,以便我们提供帮助。

要始终将窗口显示在顶部,请设置间隔为100毫秒的计时器,并将表单属性 TopMost 设置为true。