using System.Runtime.InteropServices; using Vanara.PInvoke; using static Vanara.PInvoke.Kernel32; namespace SinMaiLauncher.Interops; internal static class ConsoleInterops { public static class ExternalProcess { public static HWND? GetConsoleWindowByPid(uint pid) { if (AttachConsole(pid) == false) return null; var handle = GetConsoleWindow(); return handle; } public static bool DisableQuickEdit(uint pid) { if (AttachConsole(pid) == false) return false; var handle = GetStdHandle(StdHandleType.STD_INPUT_HANDLE); // 禁用快速编辑模式 return SetConsoleMode(handle, CONSOLE_INPUT_MODE.ENABLE_EXTENDED_FLAGS); } public enum ResultOfSendCtrlC { Success = 0, AttachConsoleFailed = 1, GenerateCtrlEventFailed = 2 } public static ResultOfSendCtrlC SendCtrlC(uint processId) { // 尝试附加到指定进程的控制台 if (!AttachConsole(processId)) return ResultOfSendCtrlC.AttachConsoleFailed; // 设置控制处理程序以避免自己进程接收到信号 SetConsoleCtrlHandler(null, true); // 发送CTRL_C_EVENT if (!GenerateConsoleCtrlEvent(CTRL_EVENT.CTRL_C_EVENT, 0)) { return ResultOfSendCtrlC.GenerateCtrlEventFailed; } // 释放控制台 FreeConsole(); // 如果没有异常发生,退出代码为Success return ResultOfSendCtrlC.Success; } } public static class CurrentProcess { public static void ConsoleAllocate() => AllocConsole(); public static void ConsoleDisableQuickEdit() { var handle = GetStdHandle(StdHandleType.STD_INPUT_HANDLE); // 禁用快速编辑模式 SetConsoleMode(handle, CONSOLE_INPUT_MODE.ENABLE_EXTENDED_FLAGS); } public static void ConsoleWindowSetParent(Control container) { var consoleHandle = GetConsoleWindow(); // 将控制台窗口设置为 Panel 的子窗口 WindowInterops.SetParent(consoleHandle, container.Handle); // 修改控制台窗口样式,去掉边框 WindowInterops.RemoveBorderVisible(consoleHandle); } public static void ConsoleWindowFill(Control container) { WindowInterops.FillWindow(GetConsoleWindow(), container); } } }