Используя AttachConsole, пока процесс, к которому я подключен, запущен и извергается, я все еще могу набирать и запускать другие команды - PullRequest
8 голосов
/ 12 апреля 2011

Используя AttachConsole, пока процесс, к которому я подключен, запущен и извергается, я все еще могу набирать и выполнять другие команды.

Моя программа запускается либо в форме, либо из командной строки.Если он запускается с аргументами, он запускается в командном окне.Я использую AttachConsole (-1), чтобы присоединить мой процесс к окну команд, из которого я вызвал.Это прекрасно работает, я получаю все свои выходные результаты из моего процесса.

Однако консоль все еще обрабатывает пользовательский ввод с клавиатуры, что бы я ни набрал, например, если я наберу 'cls' и нажму Enter,вывод будет стёрт.Как я могу заблокировать ввод пользователя в консоль во время работы процесса?

Ответы [ 3 ]

5 голосов
/ 12 апреля 2011

Это может быть не элегантно в зависимости от того, что вы делаете, но сделайте Kill () на консоли после подключения, и она продолжит получать выходные данные из вашего другого процесса.Пример кода Windows Forms, приведенного ниже, добавьте свои колокольчики и свистки:

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
   internal static class Program
    {
    [DllImport("kernel32", SetLastError = true)]
    private static extern bool AttachConsole(int dwProcessId);

    [DllImport("user32.dll")]
    private static extern IntPtr GetForegroundWindow();

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

    [STAThread]
    private static void Main(string[] args)
    {
        IntPtr ptr = GetForegroundWindow();

        int u;

        GetWindowThreadProcessId(ptr, out u);

        Process process = Process.GetProcessById(u);

        AttachConsole(process.Id);

        process.Kill();

        Application.EnableVisualStyles();

        Application.SetCompatibleTextRenderingDefault(false);

        Application.Run(new Form1());
    }
}
}
2 голосов
/ 26 марта 2013

Я нашел более чистое решение - просто отправить дополнительный «Enter» на консоль после выхода из вашей программы:

[STAThread]
public static int Main(string[] args)
{
    try
    {
        AttachConsole(ATTACH_PARENT_PROCESS);
        ...
        ...
    }
    catch (Exception eCatchAll)
    {
        ShowHelpCommand.ShowHelp(eCatchAll.ToString());     
        return (int) ConsoleReturnCode.UnexpectedError;
    }
    finally
    {
        ConsoleNewLine();
    }
}

private static void ConsoleNewLine()
{
    try
    {
        // When using a winforms app with AttachConsole the app complets but there is no newline after the process stops. This gives the newline and looks normal from the console:
        SendKeys.SendWait("{ENTER}");
    }
    catch (Exception e)
    {
        Debug.Fail(e.ToString());
    }
}
0 голосов
/ 06 сентября 2016

Не совсем уверен в этом, но разве AllocConsole вместо AttachConsole не является более легким подходом к этой проблеме?

...