Клавиша чтения на подключенной консоли C#

У меня есть приложение, которое ведет себя как формы Windows и как консольное приложение, в зависимости от того, передам ли я параметры или нет. Если я передаю параметры, он ведет себя как консольное приложение.

В последнем случае, как консольное приложение, я присоединяюсь к консоли, используя:

    [DllImport("kernel32.dll")]
    static extern bool AttachConsole(int dwProcessId);

Поэтому в начале приложения я называю это следующим образом:

AttachConsole(-1);

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

Console.ReadKey(true);

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

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

Как я могу решить это?

ОБНОВИТЬ:

static void Main(string[] args)
{            
    if (args.Length == 0)
    {   
        Application.Run(new MyForm());
    }
    else 
    {
        // case args.Length > 0            
        Console.WriteLine("Start my formless app...");
        new FormLessApp().Start(args);
    }
}

ReadKey выполняется в FormLessApp:

public class FormLessApp
{
    [DllImport("kernel32.dll")]
    static extern bool AttachConsole(int input);

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

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

     public FormLessApp()
     {
         IntPtr ptr = GetForegroundWindow();

         int  u;

         GetWindowThreadProcessId(ptr, out u);

         Process process = Process.GetProcessById(u);

         if (process.ProcessName == "cmd")    
         {
             AttachConsole(process.Id);
             Console.WriteLine("attached to console");
         }
     }

     public void Start(string[] args)
     {

           // Do some things with args
           Console.WriteLine("Press any key to continue...");
           Console.ReadKey(true);
     }
}

Воспроизвести:

Откройте командную строку Windows (cmd) и оттуда выполните ее как:

MyApp.exe param1 param2.....

0 ответов

Другие вопросы по тегам