Как сделать программу не отображаемой в Alt-Tab или на панели задач

У меня есть программа, которая должна сидеть в фоновом режиме, и когда пользователь подключается к сеансу RDP, он будет выполнять некоторую настройку среды, а затем запускает программу. Когда программа будет закрыта, она будет выполнять некоторую работу и выйти из сеанса.

Текущий способ, которым я занимаюсь, это запустить серверное приложение на этом терминале. Это построено как приложение форм Windows, чтобы окно консоли не отображалось:

public static void Main()
{
    //(Snip...) Do some setup work

    Process proc = new Process();
    //(Snip...) Setup the process
    proc.Start();
    proc.WaitForExit();

    //(Snip...) Do some housecleaning

    NativeMethods.ExitWindowsEx(0, 0);
}

Мне это очень нравится, потому что на панели задач нет элемента, и в alt-tab ничего не отображается. Однако для этого я отказался от доступа к таким функциям, как void WndProc(ref Message m) Итак, теперь я не могу слушать сообщения Windows (например, WTS_REMOTE_DISCONNECT или WTS_SESSION_LOGOFF) и не иметь дескриптора для bool WTSRegisterSessionNotification(IntPtr hWnd, int dwFlags); Я хотел бы, чтобы мой код был более надежным, поэтому он будет выполнять очистку если пользователь выходит из сеанса или отключается от сеанса до закрытия программы.

Любые рекомендации о том, как я могу получить торт и съесть его тоже?

Ответ 1

Вы можете создать скрытое окно, которое вы используете для обработки сообщений.

using System;
using System.Windows.Forms;

namespace WindowsApplication1
{
  class Program
  {
    [STAThread]
    static void Main(string[] args)
    {
      Application.Run(new MessageWindow());        
    }
  }

  class MessageWindow : Form
  {
    public MessageWindow()
    {
      this.ShowInTaskbar = false;
      this.WindowState = FormWindowState.Minimized;
      // added by MusiGenesis 5/7/10:
      this.FormBorderStyle = FormBorderStyle.FixedToolWindow;
    }

    protected override void WndProc(ref Message m)
    {
      base.WndProc(ref m);
    }
  }
}  

Ответ 2

Посмотрите на этот вопрос: Лучший способ скрыть окно из переключателя программ Alt-Tab?

Я пробовал все решения, но независимо от того, что я делаю, окно все еще отображается в списке Alt-Tab (я запускаю Vista).

В Windows Mobile вы устанавливаете для свойства формы Text значение пустое, чтобы сохранить его вне списка запущенных программ (эквивалент WinMo списка alt-tab). Возможно, это сработает для вас, но я в этом сомневаюсь.

Обновление: ОК, это все работает. Если вы создадите и покажите форму с ее FormBorderStyle, установленной в FixedToolWindow, а ее ShowInTaskbar, установленным на false, она не появится в списке Alt-Tab.

Ответ 3

Вставьте это в свой код:

protected override CreateParams CreateParams
        {
            get
            {
                CreateParams pm = base.CreateParams;
                pm.ExStyle |= 0x80;
                return pm;
            }
        }

Просто. Работает отлично на win7 64bit и, что более важно, не требуется, чтобы изменить стиль оформления рамки (я создал приложение, подобное виджетам, так что стиль настройки для fixedToolWindow не был вариантом, при этом это решение оставалось без полей и невидимым для alt- вкладка).