11

我有一个需要坐在后台的程序,当用户连接到 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 中也没有任何显示。但是,为了做到这一点,我放弃了对像 So Now 这样的功能的void WndProc(ref Message m) 访问权限如果用户在关闭程序之前注销或断开会话。WTS_REMOTE_DISCONNECTWTS_SESSION_LOGOFFbool WTSRegisterSessionNotification(IntPtr hWnd, int dwFlags);

关于如何吃蛋糕和吃蛋糕有什么建议吗?

4

3 回答 3

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);
    }
  }
}  
于 2010-05-07T22:15:40.890 回答
7

看到这个问题: Best way to hide a window from the Alt-Tab program switcher?

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

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

更新: 好的,这确实有效。如果您创建并显示一个FormBorderStyle设置为FixedToolWindowShowInTaskbar设置为的表单,false它将不会出现在 Alt-Tab 列表中。

于 2010-05-07T22:47:36.123 回答
7

将此粘贴到您的代码中:

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

就那么简单。在 win7 64 位上完美运行,更重要的是 - 它不需要更改表单边框样式(我创建了一个类似小部件的应用程序,因此无法将样式设置为 fixedToolWindow,使用此解决方案它仍然是无边框且不可见的 alt-标签)。

于 2013-06-19T21:33:49.347 回答