ฉันเดาว่าฉันตอบคำถามนี้ช้าไปหน่อย แต่ฉันจะเขียนอะไรบางอย่างสำหรับทุกคนที่มีปัญหาเดียวกัน นี่คือคำตอบเช่นเดียวกับผมมอบให้นี้คำถาม
ปัญหาของฉันคือฉันต้องการให้แอปพลิเคชันของฉันเป็นแอปพลิเคชัน GUI แต่กระบวนการที่ดำเนินการควรทำงานในพื้นหลังโดยไม่ต้องติดหน้าต่างคอนโซลแบบโต้ตอบใด ๆ ฉันคิดว่าโซลูชันนี้ควรใช้งานได้เมื่อกระบวนการหลักเป็นกระบวนการคอนโซล คุณอาจต้องลบแฟล็ก "CREATE_NO_WINDOW" ออก
ฉันจัดการเพื่อแก้ปัญหานี้โดยใช้GenerateConsoleCtrlEvent () ด้วยแอป wrapper ส่วนที่ยุ่งยากก็คือเอกสารยังไม่ชัดเจนว่าจะใช้งานได้อย่างไรและมีข้อผิดพลาดอย่างไร
ทางออกของฉันจะขึ้นอยู่กับสิ่งที่อธิบายที่นี่ แต่นั่นไม่ได้อธิบายรายละเอียดทั้งหมดอย่างแท้จริงและมีข้อผิดพลาดดังนั้นนี่คือรายละเอียดเกี่ยวกับวิธีการทำงาน
สร้างแอปพลิเคชันตัวช่วยใหม่ "Helper.exe" แอปพลิเคชันนี้จะอยู่ระหว่างแอปพลิเคชันของคุณ (ผู้ปกครอง) และกระบวนการย่อยที่คุณต้องการให้ปิดได้ นอกจากนี้ยังจะสร้างกระบวนการลูกที่แท้จริง คุณต้องมีกระบวนการ "คนกลาง" นี้มิฉะนั้น GenerateConsoleCtrlEvent () จะล้มเหลว
ใช้กลไก IPC บางประเภทเพื่อสื่อสารจากพาเรนต์ไปยังกระบวนการตัวช่วยที่ผู้ช่วยเหลือควรปิดโปรเซสลูก เมื่อผู้ช่วยเหลือได้รับเหตุการณ์นี้จะเรียกว่า "GenerateConsoleCtrlEvent (CTRL_BREAK, 0)" ซึ่งจะปิดตัวเองและกระบวนการย่อย ฉันใช้ออบเจ็กต์เหตุการณ์สำหรับสิ่งนี้เองซึ่งพาเรนต์ทำสำเร็จเมื่อต้องการยกเลิกกระบวนการย่อย
ในการสร้าง Helper.exe ของคุณให้สร้างด้วย CREATE_NO_WINDOW และ CREATE_NEW_PROCESS_GROUP และเมื่อสร้างกระบวนการลูกให้สร้างโดยไม่มีแฟล็ก (0) หมายความว่าจะได้รับคอนโซลมาจากพาเรนต์ หากไม่ทำเช่นนี้จะทำให้ไม่สนใจเหตุการณ์นั้น
เป็นสิ่งสำคัญมากที่แต่ละขั้นตอนจะทำเช่นนี้ ฉันลองใช้ชุดค่าผสมต่างๆมาแล้ว แต่ชุดนี้เป็นชุดเดียวที่ใช้ได้ คุณไม่สามารถส่ง CTRL_C เหตุการณ์ มันจะกลับมาประสบความสำเร็จ แต่จะถูกละเลยโดยกระบวนการ CTRL_BREAK เป็นหนึ่งเดียวที่ใช้ได้ผล ไม่สำคัญจริงๆเนื่องจากทั้งคู่จะเรียก ExitProcess () ในท้ายที่สุด
คุณยังไม่สามารถเรียก GenerateConsoleCtrlEvent () ด้วยรหัสกลุ่มกระบวนการของ id กระบวนการลูกโดยตรงเพื่อให้กระบวนการช่วยเหลือดำเนินต่อไปได้ สิ่งนี้จะล้มเหลวเช่นกัน
ฉันใช้เวลาทั้งวันในการพยายามทำงานนี้ วิธีนี้ใช้ได้กับฉัน แต่ถ้าใครมีอะไรจะเพิ่มกรุณาทำ ฉันไปทั่วเน็ตเพื่อค้นหาผู้คนมากมายที่มีปัญหาคล้าย ๆ กัน แต่ไม่มีวิธีแก้ปัญหาที่ชัดเจน GenerateConsoleCtrlEvent () ทำงานอย่างไรก็ค่อนข้างแปลกดังนั้นหากใครรู้รายละเอียดเพิ่มเติมโปรดแบ่งปัน
jstack
สามารถใช้แทนเรื่องนี้ได้อย่างน่าเชื่อถือ: stackoverflow.com/a/47723393/603516