2009-11-30 3 views
0

Я создаю приложение с главным окном скрыто, используя следующий код:создать независимый скрытый процесс

STARTUPINFO siStartupInfo; 
PROCESS_INFORMATION piProcessInfo; 

memset(&siStartupInfo, 0, sizeof(siStartupInfo)); 
memset(&piProcessInfo, 0, sizeof(piProcessInfo)); 

siStartupInfo.cb = sizeof(siStartupInfo); 
siStartupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_FORCEOFFFEEDBACK | STARTF_USESTDHANDLES; 
siStartupInfo.wShowWindow = SW_HIDE; 

if(CreateProcess(MyApplication, "", 0, 0, FALSE, 0, 0, 0, &siStartupInfo, &piProcessInfo) == FALSE) 
{ 
// blah  
return 0; 
} 

Все работает правильно, кроме моего основного приложения (один вызова этого кода) окно теряет фокус, когда Я открываю новую программу. Я попытался снизить приоритет нового процесса, но проблема с фокусировкой все еще существует.

Есть ли вообще избежать этого? кроме того, есть ли способ создать другой процесс без использования CreateProcess (или любого из API, вызывающих CreateProcess, таких как ShellExecute)?

Я предполагаю, что мое приложение теряет фокус, потому что оно было передано новому процессу, даже когда оно скрыто.

Для тех из вас, кто интересуется, что обязательно спросит обычное «почему вы хотите это сделать», мой ответ заключается в том, что у меня есть сторожевой процесс, который не может быть сервисом, и он запускается всякий раз, когда я открываю свой основной заявление. Доволен?

Спасибо за помощь. Код будет оценен. Джесс.

ответ

0

Приложение, в котором вы работаете, принимает фокус окна.

Один из способов обойти эту проблему - начать новый процесс на новом рабочем столе. Это помешало бы приложению украсть фокус окна на рабочем столе.

Код для запуска процесса на новом рабочем столе должен выглядеть примерно так:

HDESK hOld = GetThreadDesktop(GetCurrentThreadId()); 
HDESK hNew = OpenDesktop("name", 0, FALSE, GENERIC_ALL); 
SetThreadDesktop(hNew); 
CreateProcess(...); 
SetThreadDesktop(hOld); 
CloseDesktop(hNew); 
0

Очевидно, что целевое приложение не соблюдает флаги ShowWindow. Вам нужно исправить запущенное приложение, чтобы оно не было жадным.

+0

спасибо. Запущенное приложение работает с наименьшим приоритетом. что еще ты можешь сделать? – Jessica

+0

Не имеет ничего общего с приоритетом. Windows никогда не будет активировать (и, следовательно, фокус) из окна, если другое окно не попытается активировать. Это означает, что все ваши SW_HIDE намеки на обратное - приложение пытается активировать окно верхнего уровня. Добавьте обработчик WM_ACTIVATE в главное окно и точку останова, и окна скажут вам hwnd окна воровства. –

+0

ОК. Мне нужно понять, как записать это конкретное сообщение, но я попытаюсь это выяснить. Вы знаете способ сделать это? – Jessica

 Смежные вопросы

  • Нет связанных вопросов^_^