Как запустить Console, эмулируя запуск через start?
От: mDmitriy Россия  
Дата: 04.10.23 08:57
Оценка:
Всем привет!

Есть консольное приложение — Console1.exe (.NET FW 4.8)
1. Открываем окно команднйо строки, пишем путь к Console1.exe — приложение запускается в том же окне и том же процессе
2. Пишем в командной строке "start Console1.exe" — запускается в другом процессе и другом окне

Вопрос — можно ли написать консольное приложение так, чтобы оно при запуске эмулировало команду start и запускалось в другом процессе и другом окне?
как любое windows-приложение, к примеру

Спасибо

PS. bat-файл просьба не предлагать
Re: Как запустить Console, эмулируя запуск через start?
От: Sinclair Россия https://github.com/evilguest/
Дата: 04.10.23 09:38
Оценка:
Здравствуйте, mDmitriy, Вы писали:
D>1. Открываем окно команднйо строки, пишем путь к Console1.exe — приложение запускается в том же окне и том же процессе
нет, не в том же. Посмотрите таск менеджером — стартует другой процесс.
D>2. Пишем в командной строке "start Console1.exe" — запускается в другом процессе и другом окне

D>Вопрос — можно ли написать консольное приложение так, чтобы оно при запуске эмулировало команду start и запускалось в другом процессе и другом окне?

Скорее всего, вас спасёт последовательность из вызовов FreeConsole(), AllocConsole()
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Как запустить Console, эмулируя запуск через start?
От: mDmitriy Россия  
Дата: 04.10.23 12:11
Оценка:
Здравствуйте, Sinclair, Вы писали:

D>>1. Открываем окно команднйо строки, пишем путь к Console1.exe — приложение запускается в том же окне и том же процессе

S>нет, не в том же. Посмотрите таск менеджером — стартует другой процесс.
пусть так, но handle окна тот же

S>Скорее всего, вас спасёт последовательность из вызовов FreeConsole(), AllocConsole()

а если я запускаю из проводника?
Re[3]: Как запустить Console, эмулируя запуск через start?
От: Sinclair Россия https://github.com/evilguest/
Дата: 04.10.23 15:48
Оценка:
Здравствуйте, mDmitriy, Вы писали:
D>пусть так, но handle окна тот же
Потому, что дочерний процесс по умолчанию аттачится к консоли родительского.

S>>Скорее всего, вас спасёт последовательность из вызовов FreeConsole(), AllocConsole()

D>а если я запускаю из проводника?
Проверьте.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Как запустить Console, эмулируя запуск через start?
От: akasoft Россия  
Дата: 05.10.23 08:28
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>Вопрос — можно ли написать консольное приложение так, чтобы оно при запуске эмулировало команду start и запускалось в другом процессе и другом окне?

Можно.
Заведите параметр. Если он указан, то приложение стартует в нормальном режиме. Если нет, то выполняется (или ставится в очередь планировщика для запуска с задержкой) запуск самого себя с параметром.

Но стандартное ожидаемое поведение консольных программ — подключение к родительской консоли, если она есть, а не порождение новой.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re: Как запустить Console, эмулируя запуск через start?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 05.10.23 08:34
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>Вопрос — можно ли написать консольное приложение так, чтобы оно при запуске эмулировало команду start и запускалось в другом процессе и другом окне?

D>как любое windows-приложение, к примеру

D>Спасибо


если я правильно понял, то вот так
using System;
using System.Diagnostics;

Process.Start(new ProcessStartInfo() {
    ...
    UseShellExecute = true
});
Re[4]: Как запустить Console, эмулируя запуск через start?
От: mDmitriy Россия  
Дата: 05.10.23 09:57
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Потому, что дочерний процесс по умолчанию аттачится к консоли родительского.

переиграть это средствами C# можно?
или надо API подключать

D>>а если я запускаю из проводника?

S>Проверьте.
там отдельное консольное окно, разумеется
Re[2]: Как запустить Console, эмулируя запуск через start?
От: mDmitriy Россия  
Дата: 05.10.23 09:59
Оценка:
Здравствуйте, akasoft, Вы писали:

A>Заведите параметр. Если он указан, то приложение стартует в нормальном режиме. Если нет, то выполняется (или ставится в очередь планировщика для запуска с задержкой) запуск самого себя с параметром.

вопрос был про реализацию, а не как запустить
Re[2]: Как запустить Console, эмулируя запуск через start?
От: mDmitriy Россия  
Дата: 05.10.23 10:01
Оценка:
Здравствуйте, gandjustas, Вы писали:
G>если я правильно понял, то вот так
это запуск внешнего приложения,
а мне нужен запуск моего из командной строки в другое окно
Re[3]: Как запустить Console, эмулируя запуск через start?
От: akasoft Россия  
Дата: 05.10.23 13:57
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>вопрос был про реализацию, а не как запустить

Хм. А тут
Автор: mDmitriy
Дата: 05.10.23
пишешь про запуск.
... << RSDN@Home 1.3.110 alpha 5 rev. 62>>
Re[5]: Как запустить Console, эмулируя запуск через start?
От: Sinclair Россия https://github.com/evilguest/
Дата: 05.10.23 16:29
Оценка:
Здравствуйте, mDmitriy, Вы писали:
S>>Потому, что дочерний процесс по умолчанию аттачится к консоли родительского.
D>переиграть это средствами C# можно?
Насколько я знаю, готовой библиотеки для этого нет.
Но тут, собственно, две функции без параметров. [DllImport] в руки — и вперёд.

D>>>а если я запускаю из проводника?

S>>Проверьте.
D>там отдельное консольное окно, разумеется
Я думал, вас беспокоит то, что произойдёт при запуске приложения, которое отключается от консоли и заново её инициализирует, из проводника. Скорее всего, окно моргнёт.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Как запустить Console, эмулируя запуск через start?
От: karbofos42 Россия  
Дата: 06.10.23 09:25
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>Вопрос — можно ли написать консольное приложение так, чтобы оно при запуске эмулировало команду start и запускалось в другом процессе и другом окне?

D>как любое windows-приложение, к примеру

Так пойдёт?
    internal class Program
    {
        [DllImport("kernel32.dll")]
        static extern IntPtr GetConsoleWindow();

        [DllImport("user32.dll", SetLastError = true)]
        static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId);

        static void Main(string[] args)
        {
            GetWindowThreadProcessId(GetConsoleWindow(), out var pid);
            
            if (pid != Process.GetCurrentProcess().Id)
            {
                Process.Start(Environment.CommandLine);
                return;
            }

            Console.WriteLine("Output String");
            Console.ReadKey();
        }
    }

Если окно консоли принадлежит другому процессу, то запускаем сами себя заново, а этот процесс закрываем.
Если тот же процесс, значит работаем дальше.
Re: Как запустить Console, эмулируя запуск через start?
От: Разраб  
Дата: 06.10.23 10:35
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>Вопрос — можно ли написать консольное приложение так, чтобы оно при запуске эмулировало команду start и запускалось в другом процессе и другом окне?


"start Console1.exe"
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Как запустить Console, эмулируя запуск через start?
От: Sinclair Россия https://github.com/evilguest/
Дата: 09.10.23 12:41
Оценка: +1
Здравствуйте, mDmitriy, Вы писали:

D>Есть консольное приложение — Console1.exe (.NET FW 4.8)

D>1. Открываем окно команднйо строки, пишем путь к Console1.exe — приложение запускается в том же окне и том же процессе
D>2. Пишем в командной строке "start Console1.exe" — запускается в другом процессе и другом окне

D>Вопрос — можно ли написать консольное приложение так, чтобы оно при запуске эмулировало команду start и запускалось в другом процессе и другом окне?

См. https://github.com/evilguest/ConsoleExt
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.