创build隐藏进程(窗口不可见)

我使用的CreateProcess()启动标志设置为STARTF_USESHOWWINDOW和SW_HIDE启动一个应用程序在其窗口隐藏的背景。 我这样做是为了运行一个计划的维护任务,我不想被打扰与Windows。

在大多数情况下,窗口是隐藏的,但有些情况下,程序的窗口在你面前popup(例如谷歌的Chrome浏览器 – 我开始testing不同的应用程序,看看这是否是一次性问题,但不是)。

这种情况在Windows XP中发生得比较less,但在Vista上发生了很多。

有没有我失踪的国旗? 有没有其他的方式来创build一个窗口隐藏的过程?

谢谢!

我的示例代码是:

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 } 

Solutions Collecting From Web of "创build隐藏进程(窗口不可见)"

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

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

我不记得你的问题的答案,但我想建议,也许你不应该保持窗口完全隐藏? 如果你想把窗户挡在门外,最小化就足够了; 完全隐藏它只会消除检查计划维护任务的能力。

有些程序可以忽略/重写SW_HIDE标志。 子进程启动后,您可以尝试隐藏窗口。

另一种方法是尝试使用CreateProcessAsUser来运行已隔离桌面的会话0中的进程(从Vista版本开始)。

我建议把它作为一项服务。 首先,即使没有人登录,也可以运行预定的维护。另一方面,设置服务非常容易,以至于无法访问桌面。