создать независимый скрытый процесс - PullRequest
0 голосов
/ 30 ноября 2009

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

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)?

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

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

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

Ответы [ 2 ]

0 голосов
/ 01 декабря 2009

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

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

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

HDESK hOld = GetThreadDesktop( GetCurrentThreadId() );
HDESK hNew = OpenDesktop( "name", 0, FALSE, GENERIC_ALL );
SetThreadDesktop( hNew );
CreateProcess( ... );
SetThreadDesktop( hOld );
CloseDesktop( hNew );
0 голосов
/ 30 ноября 2009

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

...