【发布时间】:2009-08-01 22:53:17
【问题描述】:
我正在编写一个在 Windows 登录时运行的应用程序,但我希望它等到桌面完全正常运行/加载后才真正开始执行任何操作。当 Windows 完全加载完桌面后,有什么方法可以解决吗?
【问题讨论】:
我正在编写一个在 Windows 登录时运行的应用程序,但我希望它等到桌面完全正常运行/加载后才真正开始执行任何操作。当 Windows 完全加载完桌面后,有什么方法可以解决吗?
【问题讨论】:
非常老的问题,但我需要同样的问题。以下代码似乎有效:
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
// wait until desktop ready
IntPtr lHwnd = IntPtr.Zero;
do
{
lHwnd = FindWindow("Shell_TrayWnd", null);
Thread.Sleep(100);
} while (lHwnd == IntPtr.Zero);
【讨论】:
在 vista 上,您可以在自动(延迟)模式下使用服务,如果没有人以足够快的速度登录,这将在登录之前启动,但如果您希望避免在大部分系统准备好之前运行,这将起作用。如果您非常以用户为中心,希望等到他们准备就绪,那么您可能必须使用以用户为中心的触发器。
有几个指标可以让您很好地了解用户是否认为会话已准备好使用:
由于这些是启发式方法,因此您应该有一些基于时间的限制,以便在它们失火时尽可能地等待最短和最长。
【讨论】:
我假设您主要指的是基于 UI 的交互式应用程序,而不是系统服务。
没有办法知道其他应用程序何时完成加载,因为“完成”的定义并不明确。但是,您可以使用第三方实用程序(例如 http://www.chameleon-managers.com/windows-startup-manager/startup-delayer.php)来控制应用程序的启动顺序。
我很想知道您通过仅在其他桌面应用程序完成加载后才运行您的应用程序来达到什么效果。了解这一点可能有助于提出替代答案。
问候
【讨论】:
在加载应用程序时,您是否不能进入计时器循环并通过监控进程列表等到所有必备进程都加载完毕。一旦满足条件,您就可以继续初始化您的应用程序。
Process[] apps = Process.GetProcesses();
【讨论】:
只需将您的应用程序安装到startup folder。另请查看startup 上的维基百科页面。在启动文件夹read this 中安装 C# 应用程序。
【讨论】: