3

我正在使用 CreateProcess() 并将启动标志设置为 STARTF_USESHOWWINDOW 和 SW_HIDE 在后台启动应用程序并隐藏其窗口。我这样做是为了运行预定的维护任务,我不想被 Windows 打扰。

在大多数情况下,窗口是隐藏的,但在某些情况下,程序的窗口会在您面前弹出(例如 Google 的 Chrome - 我开始使用不同的应用程序进行测试,以查看这是否是曾经的问题,但不是......)。

这种情况在 Windows XP 中发生得较少,但在 Vista 中发生得很多。

有没有我丢失的标志?有没有其他方法可以创建一个隐藏其窗口的进程?

谢谢!

我的示例代码是:

char *ProgramName  
STARTUPINFO StartupInfoF;
PROCESS_INFORMATION ProcessInfoF;

memset(&StartupInfoF, 0, sizeof(StartupInfoF));
memset(&ProcessInfoF, 0, sizeof(ProcessInfoF));

StartupInfoF.cb = sizeof(StartupInfoF);
StartupInfoF.wShowWindow = SW_HIDE;
StartupInfoF.dwFlags = STARTF_USESHOWWINDOW;    

if (CreateProcess(ProgramName,
                  "",                 
                  0,
                  0,
                  FALSE,
                  DETACHED_PROCESS,
                  0,
                  0,                              
                  &StartupInfoF,
                  &ProcessInfoF) == FALSE)
{
  // error
}
else
{
  // OK
}
4

4 回答 4

4

您可以使用传递给 CreateProcess 的 STARTUPINFO 结构的 lpDesktop 成员在另一个桌面上启动进程。这样,该过程将显示其所有窗口,但在另一个桌面上,因此您(或您的用户)不会被它打扰。

我从来没有使用过多个桌面,所以我不能说会有什么副作用,但我认为这是可行的。首先查看CreateDesktop并继续前进。

于 2009-07-17T13:35:47.943 回答
0

一些程序可以忽略/覆盖SW_HIDE标志。您可以在子进程启动后尝试隐藏窗口。

另一种选择是尝试使用CreateProcessAsUser在具有隔离桌面的会话 0 中运行进程(从 Vista 版本开始)。

于 2009-07-17T13:20:21.100 回答
0

我不记得你的问题的答案,但我想建议你也许不应该完全隐藏窗口?如果您希望窗户不碍事,则将其最小化就足够了;完全隐藏它只会删除检查计划维护任务的能力。

于 2009-07-17T13:46:43.813 回答
0

我建议将其作为一项服务。一方面,即使没有人登录,它也可以运行您计划的维护。另一方面,设置服务相当容易,这样他们就无法访问桌面。

于 2009-07-17T14:14:33.823 回答