最顶层为true的WinForms对话框

最顶层为true的WinForms对话框,winforms,dialog,Winforms,Dialog,我在WinForms中实现了一个对话框,在屏幕右下角显示为notify对话框。问题在于,无论何时显示,它都会占据焦点,而只有当TopMost=true时才会发生这种情况。如何解决此问题?使用Show而不是ShowDialog显示对话框。 ShowDialog将位于最上面,用户必须在执行其他操作之前单击它(模式) Show将正常显示。此策略如何: 在启动时显示,然后立即: 使用(SW_Hide)隐藏它 永远不要关闭窗体,让它隐形 使用ShowWindow显示(SW_SHOWNOACTIVATE)

我在WinForms中实现了一个对话框,在屏幕右下角显示为notify对话框。问题在于,无论何时显示,它都会占据焦点,而只有当TopMost=true时才会发生这种情况。如何解决此问题?

使用Show而不是ShowDialog显示对话框。 ShowDialog将位于最上面,用户必须在执行其他操作之前单击它(模式)
Show将正常显示。

此策略如何:

  • 在启动时显示,然后立即:
  • 使用(SW_Hide)隐藏它
  • 永远不要关闭窗体,让它隐形
  • 使用ShowWindow显示(SW_SHOWNOACTIVATE)

  • 您需要从表单继承并重写两个属性:

    [Flags]
    enum WS_EX
    {
        TOPMOST = 0x00000008,
    }
    
    class TopMostForm : Form
    {
        protected override CreateParams CreateParams
        {
            get
            {
                var baseParams = base.CreateParams;
                baseParams.ExStyle |= (int)WS_EX.TOPMOST;
                return baseParams;
            }
        }
    
        protected override bool ShowWithoutActivation
        {
            get { return true; }
        }
    }
    

    然后只需在此表单上显示()即可,它将显示为最顶层和非活动状态。

    topmost=false;?或者说这很容易说:很容易说。我的客户希望它是TopMost=true。那么您希望在顶部有一个对话框,但没有焦点?新邮件的Sorta messenger弹出窗口?是的,与messenger弹出窗口完全相同。关于在屏幕右下角显示通知的说明:我非常讨厌应用程序假定TNA位于主屏幕的右下角。我的任务栏位于主屏幕的左侧(TNA左下角)-在主屏幕的左下角或次屏幕的右下角显示通知是正确的做法,但大多数应用程序都会出错。因此,要么像Outlook 2007一样(使通知窗口在首选项中可移动),要么有一些选项。至少,考虑桌面区域,而不是屏幕。如果TopMux=真,则不起作用。仅当TopMost=false.Ups时有效,我认为即使TopMost=false也会显示TopMost。对吗?窗样式WS_EX_TOPMOST使您的窗最顶部。如果您查看Reflector中的
    Form.TopMost
    属性,就会发现它使用了不同的方法来激活窗口。