سؤال

إذا أظهرت علبة رسالة كوسف من نافذة في عملية أخرى، فهي تعمل على ما يرام طالما بقيت برنامجي يستجيب. إذا تم إغلاقه أو إنهائه أثناء إظهار مربع MessageBox أن النوافذ التي تم تلقيها سيتم قفلها (ولكن لا تزال تستجيب) وسيتعين وضع اللمسات الأخيرة عليها عبر مدير المهام.

هنا هو نموذج التعليمات البرمجية لإظهار ذلك:

using System;
using System.Windows.Forms;
using System.Diagnostics;
using System.Threading;

namespace TestMessageBox
{
    class Program
    {
        private WindowWrapper notepad;

        Program(IntPtr handle)
        { 
            notepad = new WindowWrapper(handle); 
        }

        static void Main(string[] args)
        {
            Process[] procs = Process.GetProcessesByName("notepad");
            if (procs.Length > 0)
            {
                Console.WriteLine("Notepad detected...");
                Program program = new Program(procs[0].MainWindowHandle);
                Thread thread = new Thread(new ThreadStart(program.ShowMessage));
                thread.IsBackground = true;
                thread.Start();
                Console.Write("Press any key to end the program and lock notepad...");
                Console.ReadKey();
            }
        }

        void ShowMessage()
        { 
            MessageBox.Show(notepad, "If this is open when the program ends\nit will lock up notepad..."); 
        }
    }

    /// <summary>
    /// Wrapper class so that we can return an IWin32Window given a hwnd
    /// </summary>
    public class WindowWrapper : System.Windows.Forms.IWin32Window
    {
        public WindowWrapper(IntPtr handle)
        { 
            _hwnd = handle; 
        }
        public IntPtr Handle
        { 
            get { return _hwnd; } 
        }
        private IntPtr _hwnd;
    }

}

كيف تتجنب ذلك؟

هل كانت مفيدة؟

المحلول

يقوم قانون إظهار مربع حوار مشروط بتعطيل الإطار الأصل للحوار (نافذة المفكرة في المثال الخاص بك). عند إغلاق مربع الحوار "مشروط"، يتم إعادة تمكين النافذة الأصلية.

إذا مات برنامجك قبل إعادة تمكين النافذة، فلن يتم إعادة تمكين هذه النافذة أبدا - فهي ما يصل إلى الخيط الذي يظهر مربع الحوار لإعادة تمكين الوالد. (في مثالك، يحدث ذلك MessageBox.Show(), ، بعد النقر فوق المستخدم موافق أو أيا كان.)

الطريقة الوحيدة لجعل هذا العمل ستكون لها عملية ثانية تتحمل مسؤوليتها أن تضع الأمور كما ينبغي أن تكون إذا كانت العملية التي تقوم بإنشاء مربع الحوار مشروط يموت قبل الأوان، ولكن هذا أمر فظيع. وما زالت غير مقاومة للرصاص - ماذا لو توفيت عملية المراقب أيضا؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top