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

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

текущий способ, которым я это делаю, - у меня есть сервер терминалов, запускающий это приложение. Это построено как приложение windows forms, чтобы сохранить окно консоли от отображения:

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) и не имеют дескриптора для использования for bool WTSRegisterSessionNotification(IntPtr hWnd, int dwFlags); Я хотел бы, чтобы мой код был более надежным, поэтому он будет делать уборку, если пользователь выходит из системы или отключается от сеанса, прежде чем он закроет программу.

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

3 ответов


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

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

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

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

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

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


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

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

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