Встраивание консоли DOS в форме окон

protected List<List<T>> AllCombos<T>(Func<List<T>, List<T>, bool> comparer, params T[] items)
    {
        List<List<T>> results = new List<List<T>>();
        List<T> workingWith = items.ToList();
        results.Add(workingWith);
        items.ToList().ForEach((x) =>
        {
            results.Add(new List<T>() { x });
        });
        for (int i = 0; i < workingWith.Count(); i++)
        {
            T removed = workingWith[i];
            workingWith.RemoveAt(i);
            List<List<T>> nextResults = AllCombos2(comparer, workingWith.ToArray());
            results.AddRange(nextResults);
            workingWith.Insert(i, removed);
        }
        results = results.Where(x => x.Count > 0).ToList();
        for (int i = 0; i < results.Count; i++)
        {
            List<T> list = results[i];
            if (results.Where(x => comparer(x, list)).Count() > 1)
            {
                results.RemoveAt(i);
            }
        }

        return results;
    }

    protected List<List<T>> AllCombos2<T>(Func<List<T>, List<T>, bool> comparer, params T[] items)
    {
        List<List<T>> results = new List<List<T>>();
        List<T> workingWith = items.ToList();
        if (workingWith.Count > 1)
        {
            results.Add(workingWith);
        }
        for (int i = 0; i < workingWith.Count(); i++)
        {
            T removed = workingWith[i];
            workingWith.RemoveAt(i);
            List<List<T>> nextResults = AllCombos2(comparer, workingWith.ToArray());
            results.AddRange(nextResults);
            workingWith.Insert(i, removed);
        }
        results = results.Where(x => x.Count > 0).ToList();
        for (int i = 0; i < results.Count; i++)
        {
            List<T> list = results[i];
            if (results.Where(x => comparer(x, list)).Count() > 1)
            {
                results.RemoveAt(i);
            }
        }

        return results;
    }

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

17
задан Mark Withers 10 December 2008 в 14:06
поделиться

3 ответа

Возможно перенаправить стандартный ввод/вывод приложений консоли/DOS с помощью класса Процесса. Это могло бы выглядеть примерно так:

var processStartInfo = new ProcessStartInfo("someoldapp.exe", "-p someparameters");

processStartInfo.UseShellExecute = false;
processStartInfo.ErrorDialog = false;

processStartInfo.RedirectStandardError = true;
processStartInfo.RedirectStandardInput = true;
processStartInfo.RedirectStandardOutput = true;
processStartInfo.CreateNoWindow = true;

Process process = new Process();
process.StartInfo = processStartInfo;
bool processStarted = process.Start();

StreamWriter inputWriter = process.StandardInput;
StreamReader outputReader = process.StandardOutput;
StreamReader errorReader = process.StandardError;
process.WaitForExit();

можно теперь использовать потоки для взаимодействия с приложением. Путем установки processStartInfo. CreateNoWindow к истинному исходное приложение будет скрыт.

я надеюсь, что это помогает.

22
ответ дан 30 November 2019 в 12:58
поделиться

Относительно Вашего вопроса о том, как отобразить приложение для DOS в Приложении Windows.

существует несколько решений.

  • первый не должен просто отобразить приложение для DOS (с CreateNoWindow) и "моделировать" UI приложения для DOS в Вашем Приложении Windows путем чтения и записи в потоки.

  • другое решение состояло бы в том, чтобы использовать Win32API, получить Windows Handle (Whnd) окна приложения Консоли/DOS и установить его родителя на Вашу форму. Я в настоящее время не дома и так как это были возрасты, так как я сделал это, я не могу помнить наизусть, как это сделано. Если я не ошибусь, то необходимо будет использовать следующие вызовы API Win32:

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

4
ответ дан 30 November 2019 в 12:58
поделиться

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

1
ответ дан 30 November 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: