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