创建隐藏的进程(窗口中不可见)
-
16-09-2019 - |
题
我使用的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版本开始)。
我建议使它的服务。一方面,这将允许它运行,即使在没人登陆您的保养的计划;另一方面,这是很容易设置的服务了,使他们没有访问桌面。
不隶属于 StackOverflow