Frage

Ich mache eine Anwendung, wo ich mit jeder laufenden Anwendung interagieren. Gerade jetzt, ich brauche eine Art und Weise des Fensters z-Reihenfolge des Erhaltens. wenn Firefox und Notizblock Zum Beispiel laufen, ich muss wissen, was man vorne ist.

Irgendwelche Ideen? Außerdem tun dies für jedes Hauptfenster der Anwendung muss ich es auch tun für seine Kinder und Schwester Fenster (Fenster zu demselben Prozess gehören).

War es hilfreich?

Lösung

Sie können die GetTopWindow Funktion verwenden, um alle untergeordneten Fenster von einem übergeordneten Fenster zu suchen und ein Handle für das Kind Fenster zurück, die höchsten in z-Ordnung ist. Die GetNextWindow Funktion ruft einen Griff zum nächsten oder vorherigen Fenstern in z-Reihenfolge.

GetTopWindow: http://msdn.microsoft.com /en-us/library/ms633514(VS.85).aspx
GetNextWindow: http://msdn.microsoft.com/en- us / library / ms633509 (VS.85) aspx

Andere Tipps

Nizza und kurz und bündig:

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

Wenn Sie mehr Zuverlässigkeit:

/// <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;
}

(gemäß Abschnitt Bemerkungen auf GetWindow ist EnumChildWindows sicherer als GetWindow in einer Schleife aufrufen, weil Ihre GetWindow Schleife nicht atomar außen ändert. nach dem Abschnitt Parameter für EnumChildWindows , mit einer null-Mutter Aufruf entspricht EnumWindows.)

Dann anstelle eines separaten Aufruf für jedes Fenster EnumWindows, die auch nicht atomar und sicher von gleichzeitigen Veränderungen würden Sie jedes Fenster, das Sie in einem params Array vergleichen möchten senden, um ihre z-Aufträge können alle bei abgerufen werden zur gleichen Zeit.

            // 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);

Hier ist meine C # Lösung: Die Funktion gibt den zIndex unter den Geschwistern des gegebenen HWND, bei 0 für die niedrigste ZOrder beginnen.

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;
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top