如何使程序不显示在Alt-Tab或任务栏上

时间:2010-05-07 22:05:55

标签: c# handle message-pump

我有一个需要在后台进行的程序,当用户连接到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_DISCONNECTWTS_SESSION_LOGOFF)并且没有用于for的句柄bool WTSRegisterSessionNotification(IntPtr hWnd, int dwFlags);我希望我的代码更加健壮,因此如果用户在关闭程序之前注销或断开会话,它将执行清理工作。

关于我如何吃蛋糕和吃它的任何建议?

3 个答案:

答案 0 :(得分:11)

您可以创建用于处理消息的隐藏窗口。

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

答案 1 :(得分:7)

请参阅此问题:Best way to hide a window from the Alt-Tab program switcher?

我尝试了所有解决方案,但无论我做什么,窗口仍会显示在Alt-Tab列表中(我正在运行Vista)。

在Windows Mobile中,将表单的Text属性设置为空白,使其不在正在运行的程序列表中(相当于alt-tab列表的WinMo)。也许这对你有用,但我对此表示怀疑。

更新:好的,毕竟 可以正常工作。如果您创建并显示表单,其FormBorderStyle设置为FixedToolWindow且其ShowInTaskbar设置为false,则 将出现在Alt-中标签列表。

答案 2 :(得分:7)

将此粘贴​​到您的代码中:

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

这很简单。在win7 64bit上完美运行,更重要的是 - 它不需要,改变表格边框样式(我创建了一个类似于widget的应用程序,因此设置样式到fixedToolWindow不是一个选项,这个解决方案仍然是无边框的,对于alt-是不可见的标签)。