Как написать на вход консоли и получить дескриптор консоли?

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

    [DllImport("kernel32", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool WriteConsoleInput(
        IntPtr hConsoleInput,
        [Out] INPUT_RECORD[] lpBuffer,
        int nLength,
        out int lpNumberOfEventsWritten);


    public static void WriteConsoleInput()
    {
        UInt32 STD_INPUT_HANDLE = 0xfffffff6;
        IntPtr hConsoleInput = GetStdHandle(STD_INPUT_HANDLE);


        INPUT_RECORD[] lpBuffer = new INPUT_RECORD[2];

        // I tried using uChar (short) as well. 
        lpBuffer[0].Event.KeyEvent.wVirtualKeyCode = 0x41; // A
        lpBuffer[1].Event.KeyEvent.wVirtualKeyCode = 0x5A; // Z

        int nLength = lpBuffer.Length;
        int lpNumberOfEventsWritten;
        if (!WriteConsoleInput(
            hConsoleInput,
            lpBuffer,
            nLength,
            out lpNumberOfEventsWritten))
        {
            // Don't get here.
            Console.WriteLine("Error: {0}", GetLastError());
        }
    } // A breakpoint here shows that lpNumberOfEventsWritten is 2

    ...
    ...
    ...

    Console.Write("Input something: ");
    WriteConsoleInput();
    String input = Console.ReadLine();
    Console.WriteLine("input = {0}", input);

Я ничего не вижу на экране за «Введите что-нибудь:». Если я просто нажму Enter, ввод будет пустой строкой.


person CrashCodes    schedule 12.05.2009    source источник


Ответы (2)


Вместо того, чтобы смешивать управляемые и неуправляемые (что, вероятно, испортит предположения, которые делает System.Console), я бы предложил просто использовать P/Invoke полностью.

В MSDN есть пример: http://msdn.microsoft.com/library/ms685035.

person Richard    schedule 12.05.2009

Это работает?

public class ConsoleHandles
{
  private const uint STD_INPUT_HANDLE = 0xfffffff6;
  private const uint STD_OUTPUT_HANDLE = 0xfffffff5;
  private const uint STD_ERROR_HANDLE = 0xfffffff4;

  [DllImport("kernel32.dll")]
  private static extern int GetStdHandle(uint nStdHandle);

  public Int32 Stdin { get { return GetStdHandle(STD_INPUT_HANDLE ); } }
  //etc
}
person Cheeso    schedule 12.05.2009
comment
Ну, я не получаю дескриптор 0. Так что это плюс. Я все еще делаю что-то еще неправильно. - person CrashCodes; 13.05.2009