سؤال

لقد كنت أحاول أن أفهم Process.MainWindowHandle.

بحسب MSDN؛"النافذة الرئيسية هي النافذة التي يتم إنشاؤها عند بدء العملية.بعد التهيئة، قد يتم فتح نوافذ أخرى، بما في ذلك نوافذ Modal وTopLevel، ولكن تظل النافذة الأولى المرتبطة بالعملية هي النافذة الرئيسية." (تم اضافة التأكيدات)

لكن أثناء تصحيح الأخطاء، لاحظت أن MainWindowHandle يبدو أنه يغير القيمة...وهو ما لم أكن أتوقعه، خاصة بعد الرجوع إلى الوثائق المذكورة أعلاه.

لتأكيد السلوك، قمت بإنشاء تطبيق WinForms مستقل مع مؤقت للتحقق من MainWindowHandle لعملية "DEVENV" (Visual Studio) كل 100 مللي ثانية.

إليك الجزء المثير للاهتمام من تطبيق الاختبار هذا...

    IntPtr oldHWnd = IntPtr.Zero;

    void GetMainwindowHandle()
    {
        Process[] processes = Process.GetProcessesByName("DEVENV");

        if (processes.Length!=1)
            return;

        IntPtr newHWnd = processes[0].MainWindowHandle;

        if (newHWnd != oldHWnd)
        {
            oldHWnd = newHWnd;
            textBox1.AppendText(processes[0].MainWindowHandle.ToString("X")+"\r\n");
        }

    }

    private void timer1Tick(object sender, EventArgs e)
    {
        GetMainwindowHandle();
    }

يمكنك رؤية قيمة MainWindowHandle تتغير عندما تنقر (على سبيل المثال) على القائمة المنسدلة داخل VS.

MainWindowHandleMystery

ربما أساءت فهم الوثائق.

يمكن لأي شخص أن يلقي الضوء؟

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

المحلول

@edg،

أعتقد أنه خطأ في MSDN.يمكنك أن ترى بوضوح في Relfctor أن فحص "النافذة الرئيسية" في .NET يبدو كما يلي:

private bool IsMainWindow(IntPtr handle)
{
    return (!(NativeMethods.GetWindow(new HandleRef(this, handle), 4) != IntPtr.Zero)  
             && NativeMethods.IsWindowVisible(new HandleRef(this, handle)));
}

عندما يقوم كود .NET بتعداد النوافذ، فمن الواضح أن النافذة المرئية الأولى (أي.نافذة المستوى الأعلى) سوف تتطابق مع هذه المعايير.

نصائح أخرى

في الواقع، Process.MainWindowHandle عبارة عن مقبض للنافذة العلوية، وهو ليس في الواقع "مقبض النافذة الرئيسي"

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