Как записать на вход консоли и получить дескриптор консоли? - PullRequest
1 голос
/ 13 мая 2009

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

    [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, input будет пустой строкой.

Ответы [ 2 ]

1 голос
/ 13 мая 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
}
0 голосов
/ 13 мая 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...