c# - 透明表格不会总是保持在最前面

标签 c# winforms transparency

我需要 Form2 始终位于每个窗口的顶部 - 包括全屏游戏。这始终适用于窗口模式应用程序,但当另一个应用程序处于全屏模式时,它有时不会出现在最上面。 (游戏、OpenGL、直接)

我该如何解决这个问题?

表格 1:

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

表格 2:

WinForms 设计 View 中的设置:

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 上获得优先权。

关于c# - 透明表格不会总是保持在最前面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24266261/

相关文章:

c# - 在 C# 中克隆队列

c# - 有效文件名的正则表达式模式

c# - UWP 仅后台应用程序和异步

C# 在 Control 的生命周期中 Site (ISite) 不为空?

performance - 在 Mathematica 8 或更高版本中创建透明图像的最快方法?

c# - 克隆通用 ConfigurationSection 而不使用自定义类

c# - 如何将 bool 转换为可为 null 的 bool(bool?)

c# - 自动为图像添加水印

android - 在 Android 的 Canvas 上绘制另一个透明图像后面的/'blending' 图像

excel - 如何使用VBA使Excel 2007中的单元格透明