2009-05-12 13 views
0

私は、ユーザーが変更できる入力ストリームに既にいくつかのデータを持たせたいと思っています。私は以下の関数を調べましたが、ConsoleクラスからConsoleハンドルを取得する方法がわかりません。コンソール入力に書き込んでコンソールハンドルを取得する方法は?

[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キーを押すと、入力は空文字列になります。

答えて

0

管理対象と非管理対象を混在させるのではなく(私は、仮定を混乱させる可能性が高いです。System.Console)、P/Invokeを使用することをお勧めします。

MSDNには例があります:http://msdn.microsoft.com/library/ms685035

1

は、この仕事をしていますか?

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

まあ、私は0のハンドルを取得しません。それはプラスです。私はまだ何か間違っているよ。 – CrashCodes

関連する問題