2012-01-19 3 views
6

У меня есть приложение, которое может отображать окно с использованием формы. Форма отображается только в том случае, если приложение запускается с использованием флага -debug, иначе он отображается только в лотке.C# Закрывать процессы, минимизированные до лотка, изящным способом?

var form = new Form(); 
if(DebugMode) 
    form.Show(); 

Приложение слушает CloseMainWindow() при запуске в режиме отладки, так как форма показана. Как я могу заставить приложение также слушать CloseMainWindow(), не показывая его? Я не хочу, чтобы пользователь мог взаимодействовать с формой, если не в режиме отладки.

Я пробовал несколько подходов, например, отображать окно, но задавая размер 0. Это показывает небольшую форму, то есть не скрывает.

if (!DebugMode) 
{ 
    form.Show(); 
    form.Size = new Size(0, 0); 
} 

Кроме того, показывая его, а затем скрываясь он не работает:

if (!DebugMode) 
{ 
    form.Show(); 
    form.Hide(); 
} 

Показаны его, но начал минимизированы и не показано на панели задач не работает, либо:

if (!DebugMode) 
{ 
    form.Show(); 
    form.WindowState = FormWindowState.Minimized; 
    form.ShowInTaskbar = false; 
} 

Am Я пропустил что-то действительно очевидное здесь, или невозможно закрыть процессы, минимизированные до лотка, изящным образом?

+4

Я не знаю, если это имеет значение, но в последнем примере я бы установить свойства перед отображением формы. – f2lollpll

+0

Возможный дубликат [this.Visible не работает в Windows Forms] (http://stackoverflow.com/questions/3742709/this-visible-is-not-working-in-windows-forms) –

ответ

0

Я не уверен, что вы можете это сделать через Process.CloseMainWindow(). Процессы без видимого главного окна, как мне кажется, имеют MainWindowHandle для IntPtr.Zero.

Вам нужно какое-то обходное решение. Мой совет, чтобы следить вручную из MainWindow Ручки себя:

static void Main() 
{ 
    ... 
    MainWindow mainWindow = new MainWindow(); 
    [HandleRepository] = mainWindow.Handle; 
    Application.Run(mainWindow); 
} 

Затем, когда вы хотите, чтобы закрыть процесс, сделать это с помощью обходного:

public void EndProcess() 
{ 
    Form mainWindow= (MainWindow)Form.FromHandle([HandleRepository]); 
    mainWindow.Close(); 
} 

Может быть не самое элегантное решение, но он должен работать (не проверял)

1

Если я правильно понял проблему, вы хотите полностью скрыть форму, когда она не находится в режиме отладки (то есть окно не видно нигде, кроме диспетчера задач) и когда кто-то убивает процесс через диспетчер задач, вы хотите выполнить некоторый код для очистки или просто получать уведомление.

Базируясь мое решение на этом предположении, следующий код должен работать

public static bool DebugMode = false; 

     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 

      var form = new Form1(); 
      form.Load += (s, e) => 
          { 
           if (!DebugMode) 
           { 
            form.Opacity = 0; 
            form.ShowInTaskbar = false; 
           } 
          }; 

      form.FormClosing += (s, e) => 
            { 
             // Breakpoint hits 
            }; 

      Application.Run(form); 
     } 
Смежные вопросы