2009-07-17 6 views
3

Я использую CreateProcess() с флагами запуска, установленными в STARTF_USESHOWWINDOW и SW_HIDE, чтобы запустить приложение в фоновом режиме, скрыв его окно. Я делаю это для выполнения запланированных задач обслуживания, и я не хочу, чтобы меня беспокоили окна.Создание скрытых процессов (окно не видно)

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

Это случается меньше в 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

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

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

+0

нормально, это похоже на работу, однако я получаю сообщение об ошибке, и после поиска в MSDN он говорит, что мне не нужно иметь привилегии DESKTOP_CREATEWINDOW. Вы знаете, как изменить привилегии моего процесса и добавить DESKTOP_CREATEWINDOW? – wonderer

+0

Хорошо, я все понял. createdesktop был ответом. благодаря! – wonderer

0

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

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

+0

но это будет мерцать окно передо мной. Очень раздражает ... – wonderer

0

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

0

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