透明的窗体不会总是停留在顶部

本文关键字:停留在 顶部 窗体 透明 | 更新日期: 2023-09-27 18:09:03

我需要Form2总是在每个窗口的顶部-包括全屏游戏。这通常适用于窗口模式的应用程序,但当另一个应用程序处于全屏模式时,它有时不会出现在最上方。(游戏,OpenGL, direct)

我该如何解决这个问题?

Form1:

Overlay overlayui = new Overlay();
overlayui.TopMost = true;  // I have tried setting TopMost to false, same result.
overlayui.Show();

Form2:

WinForms设计视图中的设置:

FormBorderStyle = none
ControlBox = false
ShowIcon = false
ShowInTaskBar = false
TopMost = false

我已经实现了这段用于类似问题的代码:

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
    static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
    const UInt32 SWP_NOSIZE = 0x0001;
    const UInt32 SWP_NOMOVE = 0x0002;
    const UInt32 SWP_SHOWWINDOW = 0x0040;
public Overlay()
    {
        InitializeComponent();
        this.Bounds = Screen.PrimaryScreen.Bounds;
    }
然后我实现了一个定时器(间隔10毫秒):
private void timer1_Tick(object sender, EventArgs e)
{
    SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
}
internal class MessagesFilter : IMessageFilter
    {
        private readonly IntPtr ControlHandler;
        private const int WM_KEYUP = 0x0101;
        public MessagesFilter(IntPtr ControlHandler)
    {
        this.ControlHandler = ControlHandler;
    }
    #region IMessageFilter Members
    public bool PreFilterMessage(ref Message m)
    {
        // TODO:  Add MessagesFilter.PreFilterMessage implementation
        if (m.Msg == WM_KEYUP)
        {
            if (m.HWnd == ControlHandler)
            {
                Keys k = ((Keys)((int)m.WParam));
                if (k == Keys.Enter)
                    return true;
            }
        }
        return false;
    }
    #endregion
}
编辑:

我已经实现了新的定时器:

SetWindowPos(processNOtopmost, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE )

第一次是把我的应用放到最上面,第二次是从最上面的外部应用移除。还是同样的问题,有时有效,有时无效

透明的窗体不会总是停留在顶部

你想设置:

TopMost = true

据我所知,虽然这只使它最顶层的窗口为您的应用程序。你不能控制其他应用程序,除非你能完全防止失去焦点(不建议)。除此之外,大多数从你那里"偷走"焦点的应用程序将是DirectX,并在GPU上获得优先级。