【问题标题】:WinForms dialogs with TopMost = trueTopMost = true 的 WinForms 对话框
【发布时间】:2009-11-13 08:01:19
【问题描述】:

我在 WinForms 中实现了一个对话框,该对话框显示为屏幕右下角的通知对话框。问题是,无论何时显示它都会获得焦点,并且仅当 TopMost = true 时才会发生这种情况。我该如何解决这个问题?

【问题讨论】:

  • TopMost = false;?还是说起来容易:D
  • 说起来容易。我的客户想要它 TopMost = true。
  • 所以你想要一个顶部但没有焦点的对话框?新邮件的排序信使弹出窗口?
  • 是的,就像一个信使弹出窗口。
  • 关于在屏幕右下角显示通知的说明:我真的讨厌应用程序假定 TNA 位于主屏幕的右下角。我的任务栏位于主屏幕的左侧(TNA 左下角) - 在主屏幕的左下角或辅助屏幕的右下角显示通知是正确的做法,但大多数应用程序弄错了。因此,要么让它像 Outlook 2007 一样(使通知窗口在首选项中可移动),要么有一些选项。至少,考虑 desktop 区域,而不是 screen

标签: winforms dialog


【解决方案1】:

您需要从 Form 继承并覆盖几个属性:

[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; }
    }
}

然后只需在此表单上简单地 Show(),它将显示为最顶层且处于非活动状态。

【讨论】:

  • TopMost=true 时不起作用。仅在 TopMost=false 时有效。
  • Ups,我认为即使 TopMost=false 也会显示 TopMost。对吗?
  • 窗口样式 WS_EX_TOPMOST 使您的窗口处于最顶层。如果您查看 Reflector 中的 Form.TopMost 属性,您会发现它使用不同的方法使您的窗口处于活动状态。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    这个策略怎么样:

    1. 在启动时显示,然后立即显示:
    2. ShowWindow(SW_HIDE)隐藏它
    3. 永远不要关闭表单,让它不可见
    4. 用 ShowWindow( SW_SHOWNOACTIVATE ) 显示它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      • 1970-01-01
      • 2015-01-25
      相关资源
      最近更新 更多