كيفية الحصول على الترتيب التصاعدي في ويندوز؟

StackOverflow https://stackoverflow.com/questions/825595

  •  05-07-2019
  •  | 
  •  

سؤال

وأنا جعل تطبيق حيث أتفاعل مع كل تطبيق قيد التشغيل. الآن، أنا بحاجة إلى وسيلة للحصول على الترتيب التصاعدي الإطار. على سبيل المثال، إذا فايرفوكس والمفكرة قيد التشغيل، أريد أن أعرف من هو في الجبهة.

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

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

المحلول

ويمكنك استخدام وظيفة GetTopWindow للبحث في كافة الإطارات التابعة لإطار أصل والعودة مؤشر إلى نافذة الطفل الذي هو أعلى في الترتيب التصاعدي. وظيفة GetNextWindow استرداد مؤشر إلى الإطار التالي أو السابق في الترتيب التصاعدي.

وGetTopWindow: http://msdn.microsoft.com /en-us/library/ms633514(VS.85).aspx
GetNextWindow: http://msdn.microsoft.com/en- لنا / مكتبة / ms633509 (VS.85) .aspx اتصال

نصائح أخرى

ونيس ومقتضب:

int GetZOrder(IntPtr hWnd)
{
    var z = 0;
    for (var h = hWnd; h != IntPtr.Zero; h = GetWindow(h, GW.HWNDPREV)) z++;
    return z;
}

إذا كنت بحاجة الى مزيد من الموثوقية:

/// <summary>
/// Gets the z-order for one or more windows atomically with respect to each other. In Windows, smaller z-order is higher. If the window is not top level, the z order is returned as -1. 
/// </summary>
int[] GetZOrder(params IntPtr[] hWnds)
{
    var z = new int[hWnds.Length];
    for (var i = 0; i < hWnds.Length; i++) z[i] = -1;

    var index = 0;
    var numRemaining = hWnds.Length;
    EnumWindows((wnd, param) =>
    {
        var searchIndex = Array.IndexOf(hWnds, wnd);
        if (searchIndex != -1)
        {
            z[searchIndex] = index;
            numRemaining--;
            if (numRemaining == 0) return false;
        }
        index++;
        return true;
    }, IntPtr.Zero);

    return z;
}

(وفقا لقسم ملاحظات حول GetWindow ، EnumChildWindows هو أكثر أمانا من استدعاء GetWindow في حلقة لحلقة GetWindow ليست الذرية للتغيرات الخارجية. ووفقا لقسم معلمات <لأ href = "https://msdn.microsoft.com/en-us/library/windows/ سطح المكتب / ms633494.aspx "يختلط =" نوفولو "> EnumChildWindows ، داعيا مع أحد الوالدين لاغية ما يعادل EnumWindows).

وبعد ذلك بدلا من دعوة منفصلة لEnumWindows لكل نافذة، والذي من شأنه أيضا أن لا يكون الذري وفي مأمن من التغييرات المتزامنة، التي ترسلها كل نافذة تريد مقارنتها في مجموعة بارامس بحيث يمكن للجميع استرجاعها من أوامر ض في في نفس الوقت.

            // Find z-order for window.
            Process[] procs = Process.GetProcessesByName("notepad");
            Process top = null;
            int topz = int.MaxValue;
            foreach (Process p in procs)
            {
                IntPtr handle = p.MainWindowHandle;
                int z = 0;
                do
                {
                    z++;
                    handle = GetWindow(handle, 3);
                } while(handle != IntPtr.Zero);

                if (z < topz)
                {
                    top = p;
                    topz = z;
                }
            }

            if(top != null)
                Debug.WriteLine(top.MainWindowTitle);

وهنا هو بلدي C # الحل: ترجع الدالة zIndex بين الأشقاء من HWND معين، ابتداء من الساعة 0 لأدنى zOrder.

using System;
using System.Runtime.InteropServices;

namespace Win32
{
    public static class HwndHelper
    {
        [DllImport("user32.dll")]
        private static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd);

        public static bool GetWindowZOrder(IntPtr hwnd, out int zOrder)
        {
            const uint GW_HWNDPREV = 3;
            const uint GW_HWNDLAST = 1;

            var lowestHwnd = GetWindow(hwnd, GW_HWNDLAST);

            var z = 0;
            var hwndTmp = lowestHwnd;
            while (hwndTmp != IntPtr.Zero)
            {
                if (hwnd == hwndTmp)
                {
                    zOrder = z;
                    return true;
                }

                hwndTmp = GetWindow(hwndTmp, GW_HWNDPREV);
                z++;
            }

            zOrder = int.MinValue;
            return false;
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top