2009-11-13 4 views
2

У меня есть диалог, реализованный в WinForms, который отображается как диалог уведомления в правом нижнем углу экрана. Проблема в том, что всякий раз, когда это показано, она фокусируется, и это происходит только тогда, когда TopMost = true. Как я могу это решить?Диалоги WinForms с TopMost = true

+0

TopMost = false ;? или это было легко сказать: D – RvdK

+0

Легко сказать. Мой клиент хочет его TopMost = true. – Cornel

+0

Итак, вам нужен диалог сверху, но без фокуса? Всплывающее сообщение Sorta для новой почты? – RvdK

ответ

4

Вам необходимо наследовать от формы и переопределить ку Свойства:

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

Тогда просто покажите() на этой форме, и она будет отображаться как самая верхняя и неактивная.

+0

Это не работает, если TopMost = true. Работает только тогда, когда TopMost = false. – Cornel

+0

Упс, я думаю, что он показан TopMost, даже если TopMost = false. Правильно? – Cornel

+1

Стиль окна WS_EX_TOPMOST делает ваше окно самым большим. Если вы посмотрите на свойство Form.TopMost в Reflector, вы увидите, что он использует другой подход, который делает ваше окно активным. –

1

Показать диалог с Show вместо ShowDialog. ShowDialog будет самым верхним, пользователь должен щелкнуть его, прежде чем делать что-то еще (модальное). Show покажет это как обычно.

+0

Я открываю его с помощью метода Show() уже – Cornel

0

Как об этой стратегии:

  1. показать его при запуске, а затем сразу же:
  2. Скрыть его ShowWindow (SW_HIDE)
  3. Никогда не закрыть форму, только пусть это будет невидим
  4. Показать его с помощью ShowWindow (SW_SHOWNOACTIVATE)
Смежные вопросы