Вопрос

Я использую 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).

Я бы предложил сделать это услугой.Во-первых, это позволит ему выполнять запланированное обслуживание, даже если никто не вошел в систему.С другой стороны, довольно легко настроить службы так, чтобы у них не было доступа к рабочему столу.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top