Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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