Создание скрытых процессов (окно не видно) - PullRequest
3 голосов
/ 17 июля 2009

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

Ответы [ 4 ]

4 голосов
/ 17 июля 2009

Вы можете запустить процесс на другом рабочем столе, используя элемент lpDesktop структуры STARTUPINFO, переданный CreateProcess. Таким образом, у процесса будут отображаться все его окна, но на другом рабочем столе, поэтому вы (или ваши пользователи) не будете беспокоиться об этом.

Я никогда не работал с несколькими рабочими столами, поэтому не могу сказать, какие будут побочные эффекты, но я думаю, что это выполнимо. Начните с изучения CreateDesktop и двигайтесь вперед.

0 голосов
/ 17 июля 2009

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

0 голосов
/ 17 июля 2009

Я не помню ответ на ваш вопрос, но я хотел бы предложить, что, возможно, вам не следует держать окно полностью скрытым? Если вы хотите убрать окно с пути, достаточно его свернуть; полное его скрытие только удаляет возможность проверять запланированные задачи обслуживания.

0 голосов
/ 17 июля 2009

Некоторые программы могут игнорировать / отменять флаг SW_HIDE. Вы можете попытаться скрыть окно после запуска дочернего процесса.

Другой вариант - попытаться использовать CreateProcessAsUser для запуска процессов в сеансе 0 с изолированным рабочим столом (начиная с версии Vista).

...