我使用的CreateProcess()设置为STARTF_USESHOWWINDOW和SW_HIDE开始与它的窗口隐藏在后台的应用程序的启动标志。 我这样做是为了运行计划的维护任务,我不希望有窗户被人打扰。

在大多数情况下,窗口被隐藏,但也有该程序的窗口弹出右出在你的面前(例如谷歌的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
}
有帮助吗?

解决方案

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

我从来没有与多个桌面工作,所以我不能说什么是副作用,但我认为这是可行的。通过查看 CreateDesktop 启动和向前移动。

其他提示

我不记得回答你的问题,但我想建议,也许你不应该保留窗口完全隐藏?如果你想在窗口的方式进行,最大限度地减少它就够了;隐藏它完全只是删除检查自己的定期维护任务的能力。

某些程序可以忽略/超驰SW_HIDE标志。你可以尝试隐藏窗口后,子进程开始了。

另一种选择是尝试使用CreateProcessAsUser到在会话0已分离桌面运行过程(从Vista版本开始)。

我建议使它的服务。一方面,这将允许它运行,即使在没人登陆您的保养的计划;另一方面,这是很容易设置的服务了,使他们没有访问桌面。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top