Member 13999828 Ответов: 3

Createprocess() и что теперь?


всем привет:

У меня есть приложение (написанное на VC++ MFC), которое должно воспроизводить некоторые медиафайлы, включая только MP4, JPEG, HTML.
Я подумал, что самый простой способ-это активировать локально установленные приложения, связанные с этими расширениями файлов, и попросить эти приложения открыть мои медиафайлы.
Затем я начал использовать CreateProcess() для запуска этих локально установленных приложений, таких как Chrome или MediaPlayer, и передал им свое имя медиафайла в качестве параметров строки cmd с помощью вызова CreateProcess().

И я рад сказать, что это работает. Мои файлы воспроизводятся последовательно.

Однако после вызова локальных приложений и получения дескриптора процесса для них с помощью моего вызова CreateProcess () я хотел бы попросить приложения выполнить другие задачи, такие как изменение режима просмотра страниц с портретного на альбомный, отображение в развернутом режиме или другие интересные вещи.

Поэтому мой вопрос таков,

1 - после извлечения дескриптора процесса, могу ли я использовать его, чтобы сделать что-нибудь полезное вообще, или я могу просто использовать его для вызова TerminateProcess() или CloseHandle() ?

2 - Если я хочу попросить эти приложения выполнять определенные задачи, какие опции доступны мне и могу ли я легко получить доступ к их API ?

Ваши информированные предложения приветствуются?

Большое Спасибо, Рез.

Что я уже пробовал:

Ничего кроме того что я описал выше

#realJSOP

"HTML" обычно не считается медиафайлом.

Member 13999828

Спасибо за ваш информативный вклад.

#realJSOP

Я добавил фактический информативный ввод ниже. Заявление, на которое вы отвечаете, было скорее комментарием относительно того, что вы называете "СМИ".

Member 13999828

Ничего из того, что вы говорите, не помогает.
Но все равно спасибо

#realJSOP

Ну, вы хотели получить предложения о том, как делать то, что вы хотели сделать, и я сделал все предложения, которые мог придумать. Если вы уже подумали об этих вариантах, то наличие кого-то другого, предлагающего те же самые вещи, будет означать, что вы уже рассмотрели все свои варианты. Честно говоря, с грязью приложений, которые могут быть установлены на данной коробке, я думаю, что было бы почти невозможно иметь поддержку для каждого из них.

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

3 Ответов

Рейтинг:
2

#realJSOP

Посмотрите, есть ли связанные параметры командной строки, конфигурационные файлы или, в противном случае, записи реестра, которые вы можете изменить.

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

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

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


Рейтинг:
2

John R. Shaw

1) Используйте WaitForInputIdle, чтобы дождаться завершения инициализации процесса.
2) Использование EnumThreadWindows для перечисления всех окон верхнего уровня.

Этого должно быть достаточно, чтобы начать.
Начинай гуглить.


Member 13999828

Если процесс является консольным приложением или не имеет очереди сообщений, WaitForInputIdle немедленно возвращается. Это именно то, что я нашел с Chrome и большинством других приложений.
вам Googlin

Рейтинг:
0

megaadam

То, что говорит @realJSOP, совершенно справедливо и полезно.

Вы можете полноэкранный режим WMP из командной строки. И вы можете добавить такие параметры в CreateProcess()

Полноэкранный режим вот так:
Параметры командной строки - приложения Windows | Microsoft Docs[^]