Tôi đoán Tôi hơi muộn về vấn đề này nhưng tôi sẽ viết một cái gì đó anyway cho bất cứ ai gặp vấn đề tương tự. Đây là câu trả lời giống như tôi đã đưa ra cho câu hỏi this.
Vấn đề của tôi là tôi muốn ứng dụng của mình là một ứng dụng GUI nhưng các quy trình được thực hiện sẽ chạy trong nền mà không cần bất kỳ cửa sổ bảng điều khiển tương tác nào được đính kèm. Tôi nghĩ rằng giải pháp này cũng nên làm việc khi quá trình cha mẹ là một quá trình giao diện điều khiển. Bạn có thể phải xóa cờ "CREATE_NO_WINDOW".
Tôi đã giải quyết được điều này bằng cách sử dụng GenerateConsoleCtrlEvent() với ứng dụng trình bao bọc. Phần khó khăn chỉ là tài liệu không thực sự rõ ràng về cách sử dụng nó và những cạm bẫy với nó.
Giải pháp của tôi dựa trên những gì được mô tả here. Nhưng điều đó đã không thực sự giải thích tất cả các chi tiết hoặc với một lỗi, do đó, đây là chi tiết về cách làm cho nó hoạt động.
Tạo ứng dụng trợ giúp mới "Helper.exe". Ứng dụng này sẽ nằm giữa ứng dụng của bạn (cha mẹ) và quá trình con bạn muốn có thể đóng. Nó cũng sẽ tạo ra quá trình con thực tế. Bạn phải có quá trình "trung gian" này hoặc GenerateConsoleCtrlEvent() sẽ thất bại.
Sử dụng một số loại cơ chế IPC để liên lạc từ cha mẹ với quy trình trợ giúp mà người trợ giúp phải đóng quá trình con. Khi người trợ giúp nhận được sự kiện này, nó gọi là "GenerateConsoleCtrlEvent (CTRL_BREAK, 0)" sẽ tự đóng và quá trình con. Tôi đã sử dụng một đối tượng sự kiện cho chính bản thân mình mà cha mẹ hoàn thành khi nó muốn hủy quá trình con.
Để tạo Helper.exe của bạn, hãy tạo nó bằng CREATE_NO_WINDOW và CREATE_NEW_PROCESS_GROUP. Và khi tạo quá trình con tạo ra nó không có cờ (0) có nghĩa là nó sẽ lấy được giao diện điều khiển từ cha mẹ của nó. Không thực hiện được điều này sẽ khiến nó bỏ qua sự kiện.
Điều quan trọng là mỗi bước được thực hiện như thế này. Tôi đã thử tất cả các loại kết hợp khác nhau nhưng sự kết hợp này là sự kết hợp duy nhất hoạt động. Bạn không thể gửi sự kiện CTRL_C. Nó sẽ trả về thành công nhưng sẽ bị bỏ qua bởi quá trình. CTRL_BREAK là người duy nhất hoạt động. Không thực sự quan trọng vì cả hai sẽ gọi ExitProcess() cuối cùng.
Bạn cũng không thể gọi GenerateConsoleCtrlEvent() với id nhóm processd của id tiến trình con trực tiếp cho phép tiến trình trợ giúp tiếp tục sống. Điều này cũng sẽ thất bại.
Tôi đã dành cả ngày để làm việc này. Giải pháp này làm việc cho tôi nhưng nếu có ai khác có thể thêm vào thì hãy làm. Tôi đã đi khắp nơi trên mạng tìm kiếm rất nhiều người có vấn đề tương tự nhưng không có giải pháp xác định cho vấn đề. Làm thế nào các công trình GenerateConsoleCtrlEvent() cũng có một chút lạ nên nếu có ai biết thêm chi tiết về nó, hãy chia sẻ.
tôi đã quan tâm đến việc gửi Ctrl-C để quá trình dịch vụ java chỉ để có được threaddumps. Có vẻ như 'jstack' có thể được sử dụng một cách đáng tin cậy thay cho vấn đề cụ thể này: https://stackoverflow.com/a/47723393/603516 – Vadzim