บังคับปิดแอปพลิเคชันเมื่อปิดระบบ

ฉันมีแอปพลิเคชัน Windows Forms ซึ่งเมื่อหน้าต่างหลักปิด หน้าต่างดังกล่าวจะแสดงกล่องโต้ตอบพื้นฐานเพื่อยืนยันการดำเนินการ หากผู้ใช้ตัดสินใจที่จะยกเลิกการออกจากแอปพลิเคชันจะถูกยกเลิก

อย่างไรก็ตาม เมื่อแอปพลิเคชันทำงานย่อเล็กสุดและผู้ใช้ต้องการปิดพีซี ลำดับการปิดระบบจะหยุดลงเนื่องจากแอปพลิเคชันของฉันกำลังรอให้ผู้ใช้ยืนยันการปิดแอปพลิเคชัน (กล่องโต้ตอบจะปรากฏขึ้น)

ฉันคิดว่าจะเพิ่มตัวจับเวลาเพื่อหมดเวลา และหากไม่มีคำตอบมาในช่วงระยะเวลาหนึ่ง ให้ปิดแอปพลิเคชันโดยอัตโนมัติ แต่ถึงแม้จะเป็นวิธีที่จะทำได้ แต่ก็ไม่ใช่วิธีที่แอปอื่นๆ ทำอย่างแน่นอน

แล้วจะมีวิธีแก้ปัญหาที่เหมาะสมที่สุดเพื่อยืนยันการปิดแอปพลิเคชันในกรณีอื่นๆ เว้นแต่ระบบจะปิดตัวลง?

ขอบคุณ!


person Jano Rajmond    schedule 15.11.2011    source แหล่งที่มา


คำตอบ (5)


ในกิจกรรม FormClosing ของคุณ ให้ตรวจสอบ FormClosingEventArgs' CloseReason เพื่อดูว่าเหตุใดหน้าต่างจึงปิดตัวลง หากเป็น CloseReason.WindowsShutDown ก็ไม่ต้องแสดงกล่องโต้ตอบของคุณและอย่ายกเลิกการปิดแบบฟอร์มของคุณ

private void MyForm_FormClosing(object sender, FormClosingEventArgs e)
{
    // Verify that we're not being closed because windows is shutting down.
    if (e.CloseReason != CloseReason.WindowsShutDown)
    {
        // Show your dialog / cancel closing. 
    }
}

หมายเหตุ: คุณอาจต้องการรวม CloseReason.TaskManagerClosing เนื่องจากผู้ใช้ต้องการปิดแอปพลิเคชันของคุณอย่างชัดเจนในสถานการณ์นั้น และผู้จัดการงานขอการยืนยันแล้ว หรือแสดงเฉพาะกล่องโต้ตอบของคุณสำหรับ CloseReason.UserClosing

person Johannes Kommer    schedule 15.11.2011
comment
ขอบคุณมากครับ สิ่งนี้ช่วยฉันได้มาก! - person Jano Rajmond; 15.11.2011

ในตัวจัดการเหตุการณ์การปิดบัญชี ซึ่งคุณสามารถกำหนดได้ดังนี้:

    this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Form1_FormClosing);

และที่ฉันเดาว่าคุณกำลังโพสต์กล่องโต้ตอบการยืนยันของคุณ คุณสามารถตรวจสอบอาร์กิวเมนต์ CloseReason และไม่โพสต์กล่องโต้ตอบหากเป็นการปิดระบบที่เป็นสาเหตุ:

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (e.CloseReason == CloseReason.WindowsShutDown)
        {
            //do not show the dialog
        }
    }
person zmilojko    schedule 15.11.2011

SystemEvents ช่วยคุณได้ SessionEnding เกิดขึ้นเมื่อผู้ใช้พยายามออกจากระบบหรือปิดระบบ

Microsoft.Win32.SystemEvents.SessionEnding += (sender, e) => DoYourJob();
person JiBéDoublevé    schedule 15.11.2011
comment
มีประโยชน์สำหรับสถานการณ์ของฉันเช่นกัน - ให้ UI ทดแทนแก่แอปที่ขาดการตรวจสอบ และพีซีถูกล็อคจนคุณไม่สามารถรีสตาร์ทแอปได้หากคุณปิดมัน - person Roger Willcocks; 06.03.2014

คุณสามารถใช้ Application.SessionEnding Event เพื่อทำความเข้าใจว่าระบบกำลังจะปิดตัวลงหรือไม่

http://msdn.microsoft.com/en-us/library/system.windows.application.sessionending.aspx

person Massimiliano Peluso    schedule 15.11.2011

คุณสามารถฟัง เหตุการณ์การปิดระบบ และออกจากแอปพลิเคชันโดยไม่มีกล่องข้อความ .

person H-Man2    schedule 15.11.2011