从托管代码访问 GetConsoleHistoryInfo()
Accessing GetConsoleHistoryInfo() from managed code
我有一个模糊的 Java 背景并且刚刚安装了 Visual Studio 社区 2015。玩它所以有一个控制台应用程序 运行 并想使用上面的功能附加到不同的控制台后。问题是我不知道这个函数的适当声明——有人能告诉我在这个例子中它应该是什么,但对我来说也是一个很好的指针,这样我就可以自己解决了。 IDE 似乎没什么用
using System.Runtime.InteropServices;
namespace ConsoleStuff
{
class Program
{
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool GetConsoleHistoryInfo();
static void Main(string[] args)
{
GetConsoleHistoryInfo(); // <-- PInvokeStackImbalance occurred
}
}
}
你应该这样声明:
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool GetConsoleHistoryInfo(ref CONSOLE_HISTORY_INFO ConsoleHistoryInfo);
您还需要 CONSOLE_HISTORY_INFO 类型才能工作:
[StructLayout(LayoutKind.Sequential)]
public struct CONSOLE_HISTORY_INFO
{
uint cbSize;
uint HistoryBufferSize;
uint NumberOfHistoryBuffers;
uint dwFlags;
}
可以在 PInvoke.net 找到很多有用的 PInvoke 信息。但是,您应该根据 MSDN 仔细检查它是否适合。
我有一个模糊的 Java 背景并且刚刚安装了 Visual Studio 社区 2015。玩它所以有一个控制台应用程序 运行 并想使用上面的功能附加到不同的控制台后。问题是我不知道这个函数的适当声明——有人能告诉我在这个例子中它应该是什么,但对我来说也是一个很好的指针,这样我就可以自己解决了。 IDE 似乎没什么用
using System.Runtime.InteropServices;
namespace ConsoleStuff
{
class Program
{
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool GetConsoleHistoryInfo();
static void Main(string[] args)
{
GetConsoleHistoryInfo(); // <-- PInvokeStackImbalance occurred
}
}
}
你应该这样声明:
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool GetConsoleHistoryInfo(ref CONSOLE_HISTORY_INFO ConsoleHistoryInfo);
您还需要 CONSOLE_HISTORY_INFO 类型才能工作:
[StructLayout(LayoutKind.Sequential)]
public struct CONSOLE_HISTORY_INFO
{
uint cbSize;
uint HistoryBufferSize;
uint NumberOfHistoryBuffers;
uint dwFlags;
}
可以在 PInvoke.net 找到很多有用的 PInvoke 信息。但是,您应该根据 MSDN 仔细检查它是否适合。