Запуск дочернего процесса в качестве родительского процесса - PullRequest
1 голос
/ 31 мая 2019

Возможно ли запустить дочерний процесс как родительский процесс?

Моя структура каталогов выглядит следующим образом:

  • app / program.exe
    • app/bin/internal.exe
    • app / bin / что-то.dll

program.exe просто выполняет internal.exe с некоторыми аргументами.

#include <stdio.h> 
#include <process.h> 

int main(void) {
    _execl(".\\bin\\internal.exe",
        "internal.exe", "some args", NULL);

    return 0;
}

Аргументы важны;без них internal.exe ничего не сделает.

Это в основном работает нормально, но плохо интегрируется с панелью задач.Программа отображается на панели задач как internal.exe, и ее закрепление на панели задач бесполезно, поскольку нажатие на закрепленный ярлык выполнит internal.exe без аргументов и немедленно закроется.

Я хотел бы, чтобы он отображался как program.exe на панели задач, чтобы при закреплении его на панели задач вместо рабочей части работал рабочий «модуль запуска».

Возможно ли это?

1 Ответ

1 голос
/ 01 июня 2019

Вы не можете изменить ребенка, чтобы стать родителем с точки зрения реальных процессов.Панель задач работает на более высоком уровне и дает вам больше контроля.

MSDN говорит :

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

...

Кооперативные или связанные процессы, которые для пользователя являются частью одного и того же приложения, должны иметь одинаковый AppUserModelID, примененный к каждомупроцесс.Примеры включают игры с процессом запуска (цепочкой) и проигрывателем Microsoft Windows Media, который запускается / запускается в одном процессе, а основное приложение запускается в другом процессе (кооперативно).

Если вы не являетесь автором дочернего приложения, все усложняется.

Если это Java или какой-либо другой тип фреймворка, для него должно быть установлено значение IsHostApp.Если нет, вы можете попробовать поиграть с UseExecutableForTaskbarGroupIcon и TaskbarGroupIcon, но это не изменит AppUserModelID.Настройка NoStartPage не позволит пользователю закрепить дочернее приложение.

Если вы знаете, как найти окно дочернего приложения, вы можете вызвать SHGetPropertyStoreForWindow в родительском приложении и установитьидентификатор того же идентификатора, что и родительский процесс и / или установка свойств System.AppUserModel.Relaunch*.

...