C# 制表符时最顶端不工作

C# 制表符时最顶端不工作,c#,winforms,C#,Winforms,几分钟前,我遇到了一个奇怪的问题。我创建了一个最顶层的表单(WinForms),做了一些选项卡,一切都很好 然后我试着打开一个电脑游戏(fullscren窗口),这意味着游戏是全屏的,但在窗口模式下,这意味着你仍然可以用表单覆盖它。例如,在我打开浏览器之前一切正常(可以是任何其他程序(编辑器))。作为一个简短的补充,我有两个监视器 我用标签从电脑游戏(我的表格在最上面)进入浏览器 我单击了浏览器中的某个位置(url) 我用标签回到游戏中,点击游戏中的某个地方(我的表单仍然是最上面的) 我再次执行

几分钟前,我遇到了一个奇怪的问题。我创建了一个最顶层的表单(WinForms),做了一些选项卡,一切都很好

然后我试着打开一个电脑游戏(fullscren窗口),这意味着游戏是全屏的,但在窗口模式下,这意味着你仍然可以用表单覆盖它。例如,在我打开浏览器之前一切正常(可以是任何其他程序(编辑器))。作为一个简短的补充,我有两个监视器

  • 我用标签从电脑游戏(我的表格在最上面)进入浏览器
  • 我单击了浏览器中的某个位置(url)
  • 我用标签回到游戏中,点击游戏中的某个地方(我的表单仍然是最上面的)
  • 我再次执行步骤1-3,突然我的状态(最上面的)消失了 每次我这样做的时候都会发生这种情况,这个问题至少可以在另外两台计算机上重现 机器

    编辑:

    我试图实施建议的解决方案

    public partial class Form1 : Form
    {
        const UInt32 SWP_NOSIZE = 0x0001;
        const UInt32 SWP_NOMOVE = 0x0002;
        const UInt32 SWP_NOACTIVATE = 0x0010;
    
        [DllImport("user32.dll")]
        static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
    
        public void setTOP()
        {
            SetWindowPos(this.Handle, new IntPtr(-1), 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
        }
    
        public Form1()
        {
            InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
            this.setTOP();
        }
    }
    

    但是这不起作用。

    最顶级的API只是设置了windows的顺序。我建议再次调用“最上面的”标志
    TopMost=False
    TopMost=True
    重置订单。因为另一个窗口可以对操作系统使用相同的命令

    后台工作API(仅供参考)


    关于

    当您的应用程序获得关注时,您最好再次调用topmost。

    这是一个可怕的解决方案,但到目前为止总比什么都没有好


    我实现了一个计时器,它每x秒调用一次topmost。正如我所说,这不是一个好的解决方案,但却是我唯一想到的。我会继续研究这个问题,但目前我就是这么做的。

    我怎么知道什么时候再打电话给topmost???因为表单没有聚焦或者我不知道它什么时候会进入背景/消失。。。我还试着使用SetWindowPos,但它不会改变任何东西。嗨,莱恩。在我的例子中,它是有效的。请告诉我是否有任何游戏使用DirectX或图形加速视频或类似的东西?也许视频加速是个问题?同样的问题也在这里(德语),并通过下面的代码解决了:我测试的游戏是星际争霸2。也许我没有正确地实现它,但由于它是除此场景之外的最高级别,我不认为我犯了错误。如果它不可见,它应该如何聚焦2。对于用户来说,每次点击标签时都要关注它,这有点烦人。
    Declare Function SetWindowPos Lib "user32.dll" ( _
                     ByVal hwnd As integer, _
                     ByVal hWndInsertAfter As integer, _
                     ByVal x As integer, _
                     ByVal y As integer, _
                     ByVal cx As integer, _
                     ByVal cy As integer, _
                     ByVal wFlags As integer) As integer