123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- 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);
- }
- }
- }
|