ConsoleInterops.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System.Runtime.InteropServices;
  2. using Vanara.PInvoke;
  3. using static Vanara.PInvoke.Kernel32;
  4. namespace SinMaiLauncher.Interops;
  5. internal static class ConsoleInterops
  6. {
  7. public static class ExternalProcess
  8. {
  9. public static HWND? GetConsoleWindowByPid(uint pid)
  10. {
  11. if (AttachConsole(pid) == false) return null;
  12. var handle = GetConsoleWindow();
  13. return handle;
  14. }
  15. public static bool DisableQuickEdit(uint pid)
  16. {
  17. if (AttachConsole(pid) == false) return false;
  18. var handle = GetStdHandle(StdHandleType.STD_INPUT_HANDLE);
  19. // 禁用快速编辑模式
  20. return SetConsoleMode(handle, CONSOLE_INPUT_MODE.ENABLE_EXTENDED_FLAGS);
  21. }
  22. public enum ResultOfSendCtrlC
  23. {
  24. Success = 0,
  25. AttachConsoleFailed = 1,
  26. GenerateCtrlEventFailed = 2
  27. }
  28. public static ResultOfSendCtrlC SendCtrlC(uint processId)
  29. {
  30. // 尝试附加到指定进程的控制台
  31. if (!AttachConsole(processId)) return ResultOfSendCtrlC.AttachConsoleFailed;
  32. // 设置控制处理程序以避免自己进程接收到信号
  33. SetConsoleCtrlHandler(null, true);
  34. // 发送CTRL_C_EVENT
  35. if (!GenerateConsoleCtrlEvent(CTRL_EVENT.CTRL_C_EVENT, 0))
  36. {
  37. return ResultOfSendCtrlC.GenerateCtrlEventFailed;
  38. }
  39. // 释放控制台
  40. FreeConsole();
  41. // 如果没有异常发生,退出代码为Success
  42. return ResultOfSendCtrlC.Success;
  43. }
  44. }
  45. public static class CurrentProcess
  46. {
  47. public static void ConsoleAllocate() => AllocConsole();
  48. public static void ConsoleDisableQuickEdit()
  49. {
  50. var handle = GetStdHandle(StdHandleType.STD_INPUT_HANDLE);
  51. // 禁用快速编辑模式
  52. SetConsoleMode(handle, CONSOLE_INPUT_MODE.ENABLE_EXTENDED_FLAGS);
  53. }
  54. public static void ConsoleWindowSetParent(Control container)
  55. {
  56. var consoleHandle = GetConsoleWindow();
  57. // 将控制台窗口设置为 Panel 的子窗口
  58. WindowInterops.SetParent(consoleHandle, container.Handle);
  59. // 修改控制台窗口样式,去掉边框
  60. WindowInterops.RemoveBorderVisible(consoleHandle);
  61. }
  62. public static void ConsoleWindowFill(Control container)
  63. {
  64. WindowInterops.FillWindow(GetConsoleWindow(), container);
  65. }
  66. }
  67. }