Создание скрытых процессов (окно не видно)
-
16-09-2019 - |
Вопрос
Я использую CreateProcess() с флагами запуска, установленными на STARTF_USESHOWWINDOW и SW_HIDE, чтобы запустить приложение в фоновом режиме со скрытым окном.Я делаю это для выполнения запланированных задач по обслуживанию и не хочу, чтобы меня беспокоили окна.
В большинстве случаев окна скрыты, но бывают случаи, когда окно программы появляется прямо перед вами (например, 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
}
Решение
Вы можете запустить процесс на другом рабочем столе, используя член lpDesktop структуры STARTUPINFO, переданный в CreateProcess.Таким образом, все окна процесса будут отображаться, но на другом рабочем столе, так что вас (или ваших пользователей) это не будет беспокоить.
Я никогда не работал с несколькими настольными компьютерами, поэтому не могу сказать, каковы будут побочные эффекты, но думаю, что это выполнимо.Начните с изучения Создать рабочий стол и двигаться дальше.
Другие советы
Я не помню ответа на ваш вопрос, но хочу подсказать, может быть, не стоит полностью скрывать окно?Если вы хотите, чтобы окно не мешало, достаточно его свернуть;его полное скрытие только лишает возможности проверять выполнение запланированных задач обслуживания.
Некоторые программы могут игнорировать/переопределять SW_HIDE
флаг.Вы можете попытаться скрыть окно после запуска дочернего процесса.
Другой вариант — попробовать использовать CreateProcessAsUser
для запуска процессов в сеансе 0 с изолированным рабочим столом (начиная с версии Vista).
Я бы предложил сделать это услугой.Во-первых, это позволит ему выполнять запланированное обслуживание, даже если никто не вошел в систему.С другой стороны, довольно легко настроить службы так, чтобы у них не было доступа к рабочему столу.