标签时TopMost不工作

时间:2011-11-11 13:24:31

标签: c# winforms

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

然后我尝试打开一个电脑游戏(全屏窗口),这意味着游戏是全屏的,但是在窗口模式下,这意味着你仍然可以用表格覆盖它。一切都很好,直到我打开我的浏览器为例(可能是任何其他程序(编辑))。就像快速注释一样,我有两台显示器。

  1. 我从电脑游戏(我的表格是TopMost)中删除了浏览器
  2. 我点击了浏览器中的某个位置(网址)
  3. 我回到游戏中,点击游戏中的某个地方(我的表格仍然是TopMost)
  4. 我再次执行步骤1-3,突然我的表格(最顶层)消失了。
  5. 每次我这样做都会发生这种情况,这个问题至少可以在其他2个问题上重现 机等。

    修改

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

    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();
        }
    }
    

    但这不起作用。

3 个答案:

答案 0 :(得分:1)

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

后台工作API(仅供参考)

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

http://www.activevb.de/cgi-bin/apiwiki/SetWindowPos

此致

答案 1 :(得分:1)

您最好的选择可能是在您的应用程序获得焦点时再次调用。

答案 2 :(得分:1)

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

我实现了一个每隔x秒调用最顶层的计时器。就像我说的那样,这不是一个好的解决方案,而是唯一一个我想到的解决方案。我将继续努力,但与此同时,这就是我的工作。