更新:增加了一個樣本
如果你準備做一些P/Invoke的東西,這可能會有所幫助。
基本上,如果你得到一個控制檯緩衝區的句柄,那麼你可以使用標準的Win32 API來操作緩衝區,甚至可以將整個緩衝區關閉屏幕,並將其傳送到控制檯。
唯一棘手的部分是獲取控制檯緩衝區的句柄。我沒有在.NET中嘗試過這種方式,但在過去的幾年中,您可以通過使用CreateFile(您將需要P/Invoke this)來獲取當前控制檯的句柄,並打開「CONOUT $」,然後您可以使用句柄將返回傳遞給其他API。
的P/Invoke爲的CreateFile
http://www.pinvoke.net/default.aspx/kernel32/CreateFile.html
你也可以使用WriteConsoleOutput所有的人物和他們的屬性從內存緩衝區控制檯緩衝區中移動。
http://msdn.microsoft.com/en-us/library/ms687404(VS.85).aspx
您可以將一個很好的庫放在一起,以提供對控制檯緩衝區的低級訪問。
因爲我想讓我的.NET再次受到傷害,所以我想我會試試看這個,看看我能否得到它的工作。這是一個樣例,它將填滿所有字母A-Z並貫穿所有forground屬性0-15。我想你會對錶演留下深刻的印象。我會說實話,我沒有花太多時間閱讀這段代碼,所以錯誤檢查是零,這裏或那裏可能有一個小錯誤,但它應該讓你去與其餘的API。
using System;
using System.IO;
using System.Runtime.InteropServices;
using Microsoft.Win32.SafeHandles;
namespace ConsoleApplication1
{
class Program
{
[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern SafeFileHandle CreateFile(
string fileName,
[MarshalAs(UnmanagedType.U4)] uint fileAccess,
[MarshalAs(UnmanagedType.U4)] uint fileShare,
IntPtr securityAttributes,
[MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
[MarshalAs(UnmanagedType.U4)] int flags,
IntPtr template);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool WriteConsoleOutput(
SafeFileHandle hConsoleOutput,
CharInfo[] lpBuffer,
Coord dwBufferSize,
Coord dwBufferCoord,
ref SmallRect lpWriteRegion);
[StructLayout(LayoutKind.Sequential)]
public struct Coord
{
public short X;
public short Y;
public Coord(short X, short Y)
{
this.X = X;
this.Y = Y;
}
};
[StructLayout(LayoutKind.Explicit)]
public struct CharUnion
{
[FieldOffset(0)] public char UnicodeChar;
[FieldOffset(0)] public byte AsciiChar;
}
[StructLayout(LayoutKind.Explicit)]
public struct CharInfo
{
[FieldOffset(0)] public CharUnion Char;
[FieldOffset(2)] public short Attributes;
}
[StructLayout(LayoutKind.Sequential)]
public struct SmallRect
{
public short Left;
public short Top;
public short Right;
public short Bottom;
}
[STAThread]
static void Main(string[] args)
{
SafeFileHandle h = CreateFile("CONOUT$", 0x40000000, 2, IntPtr.Zero, FileMode.Open, 0, IntPtr.Zero);
if (!h.IsInvalid)
{
CharInfo[] buf = new CharInfo[80 * 25];
SmallRect rect = new SmallRect() { Left = 0, Top = 0, Right = 80, Bottom = 25 };
for (byte character = 65; character < 65 + 26; ++character)
{
for (short attribute = 0; attribute < 15; ++attribute)
{
for (int i = 0; i < buf.Length; ++i)
{
buf[i].Attributes = attribute;
buf[i].Char.AsciiChar = character;
}
bool b = WriteConsoleOutput(h, buf,
new Coord() { X = 80, Y = 25 },
new Coord() { X = 0, Y = 0 },
ref rect);
}
}
}
Console.ReadKey();
}
}
}
非常感謝您的幫助!我現在只是能夠得到一些基本的輸出後一些亂七八糟。我使用GetStdHandle獲取緩衝區,然後將它傳遞給CharInfo的矩形數組。將檢查你的下一個! – Statement 2010-05-02 20:55:26
實際上,GetStdHandle可以取代CreateFile的調用。 – 2010-05-02 21:06:40
額外酷.... – IAbstract 2011-06-12 17:49:24