Saya kira saya agak terlambat dalam pertanyaan ini tetapi saya akan tetap menulis sesuatu untuk siapa pun yang memiliki masalah yang sama. Ini adalah jawaban yang sama seperti yang saya berikan untuk pertanyaan ini .
Masalah saya adalah bahwa saya ingin aplikasi saya menjadi aplikasi GUI tetapi proses yang dijalankan harus dijalankan di latar belakang tanpa jendela konsol interaktif yang terpasang. Saya pikir solusi ini juga harus berfungsi ketika proses induk adalah proses konsol. Anda mungkin harus menghapus bendera "CREATE_NO_WINDOW".
Saya berhasil menyelesaikan ini menggunakan GenerateConsoleCtrlEvent () dengan aplikasi pembungkus. Bagian yang sulit adalah bahwa dokumentasinya tidak begitu jelas tentang bagaimana tepatnya itu dapat digunakan dan jebakannya.
Solusi saya didasarkan pada apa yang dijelaskan di sini . Tapi itu juga tidak benar-benar menjelaskan semua detail dan dengan kesalahan, jadi inilah detail tentang cara membuatnya berfungsi.
Buat aplikasi pembantu baru "Helper.exe". Aplikasi ini akan berada di antara aplikasi Anda (induk) dan proses anak yang ingin Anda tutup. Ini juga akan menciptakan proses anak yang sebenarnya. Anda harus memiliki proses "orang tengah" ini atau GenerateConsoleCtrlEvent () akan gagal.
Gunakan beberapa jenis mekanisme IPC untuk berkomunikasi dari induk ke proses helper bahwa helper harus menutup proses anak. Saat helper mendapatkan acara ini, ia memanggil "GenerateConsoleCtrlEvent (CTRL_BREAK, 0)" yang menutup sendiri dan proses turunannya. Saya menggunakan objek acara untuk ini sendiri yang diselesaikan oleh orang tua ketika ingin membatalkan proses anak.
Untuk membuat Helper.exe Anda, buatlah dengan CREATE_NO_WINDOW dan CREATE_NEW_PROCESS_GROUP. Dan saat membuat proses anak, buatlah tanpa flag (0) yang berarti itu akan mendapatkan konsol dari induknya. Gagal melakukan ini akan menyebabkan acara diabaikan.
Sangat penting bahwa setiap langkah dilakukan seperti ini. Saya telah mencoba semua jenis kombinasi tetapi kombinasi ini adalah satu-satunya yang berhasil. Anda tidak dapat mengirim acara CTRL_C. Ini akan mengembalikan kesuksesan tetapi akan diabaikan oleh prosesnya. CTRL_BREAK adalah satu-satunya yang berhasil. Tidak terlalu penting karena keduanya akan memanggil ExitProcess () pada akhirnya.
Anda juga tidak dapat memanggil GenerateConsoleCtrlEvent () dengan id grup proses dari id proses anak secara langsung memungkinkan proses pembantu untuk terus hidup. Ini juga akan gagal.
Saya menghabiskan sepanjang hari mencoba untuk membuat ini bekerja. Solusi ini berfungsi untuk saya, tetapi jika ada yang ingin ditambahkan, harap lakukan. Saya mencari banyak orang dengan masalah serupa tetapi tidak ada solusi pasti untuk masalah tersebut. Cara kerja GenerateConsoleCtrlEvent () juga agak aneh jadi jika ada yang tahu lebih banyak detailnya, silakan bagikan.
jstack
dapat digunakan dengan andal sebagai gantinya untuk masalah khusus ini: stackoverflow.com/a/47723393/603516