Frage

Wie können wir den Griff eines Fensters bekommen, das keinen Titel hat? Gibt es eine Möglichkeit, alle Fenster auf dem Desktop aufzuzählen und das Fenster zu filtern, das keinen Titel hat (in meinem Fall, es gibt nur einen) und das Griff zu bekommen. Oder durch Angabe anderer Attribute wie ein Fenster, das hat eine bestimmte Schaltfläche oder Listbox usw. ...

War es hilfreich?

Lösung

Dies sollte es tun:

    ...
    using System.Runtime.InteropServices;
    using System.Diagnostics;

    ...

public class foo()
{
    ...

    [DllImport ("user32")]
    internal static extern int GetWindowText (int hWnd, String text, int nMaxCount);

    [DllImport ("user32.dll")]
    public static extern int GetWindowTextLength (int hWnd);

    [DllImport ("user32.dll")]
    public static extern int FindWindow (String text, String class_name);

    [DllImport ("user32.dll")]
    public static extern int FindWindowEx (int parent, int start, String class_name);

    [DllImport ("user32.dll")]
    public static extern int GetWindow (int parent, uint cmd);

    public List<int> FindTitlelessWindows()
    {
        List<int> titleless = new List<int> ();

        Process [] procs = Process.GetProcesses ();
        IntPtr hWnd;

        foreach (Process proc in procs)
        {
            hWnd = proc.MainWindowHandle;
            if (hWnd != IntPtr.Zero)
            {
                TraverseHierarchy (hWnd.ToInt32 (), 0, titleless);

            }
        }

        foreach (int i in titleless)
        {
            System.Console.WriteLine (i);
        }

        return titleless;
    }

    public void TraverseHierarchy (int parent, int child, List<int> titleless)
    {
        String text = "";
        GetWindowText (parent, text, GetWindowTextLength (parent));
        if (String.IsNullOrEmpty (text))
        {
            titleless.Add (parent);
        }

        TraverseChildern (parent, titleless);
        TraversePeers (parent, child, titleless);

    }

    public void TraverseChildern(int handle, List<int> titleless)
    {
        // First traverse child windows
        const uint GW_CHILD = 0x05;
        int child = GetWindow (handle, GW_CHILD);
        if (0 != child)
        {
            TraverseHierarchy (child, 0, titleless);

        }
    }

    public void TraversePeers(int parent, int start, List<int> titleless)
    {
        // Next traverse peers
        int peer = FindWindowEx(parent, start, "");
        if (0 != peer)
        {
            TraverseHierarchy (parent, peer, titleless);
        }

    }
}

Andere Tipps

Schauen Sie sich die Funktion "EnumchildWindows" an.

Ich denke, wenn Sie den Zeiger des Hauptfensters (dh Desktop) an diese Funktion übergeben, können Sie eine Liste aller Fenster und ihrer untergeordneten Fenster erhalten.

In Kombination mit FindWindow sollte es möglich sein, den Griff in das gewünschte Fenster zu bringen, sobald Sie eine erwartete Kinderregelung finden.

So etwas sollte funktionieren, nicht getestet

[DllImport("user32", CharSet = CharSet.Auto, SetLastError = true)]
internal static extern int GetWindowText(IntPtr hWnd, [Out, MarshalAs(UnmanagedType.LPTStr)] StringBuilder lpString, int nMaxCount);

[DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern int GetWindowTextLength(IntPtr hWnd); 

....
Process[] procs = Process.GetProcesses();
IntPtr hWnd;
foreach(Process proc in procs)
{
    hWnd = proc.MainWindowHandle;
    if (hWnd != IntPtr.Zero)
    {
        int length = GetWindowTextLength(hWnd);
        StringBuilder sb = new StringBuilder(length + 1);
        GetWindowText(hWnd, sb, length);
        if (String.IsNullOrEmpty(sb.ToString())
        {
            // we have a window with no title!
        }
    }
}

http://msdn.microsoft.com/en-us/library/ms633558(vs.85).aspx

WindowFrompoint gibt einen Griff oder Null zurück, wenn sich kein Fenster unter Ihrem Cursor befindet. Könnte dies verwendet werden oder versuchen Sie, den Prozess zu automatisieren?

Hier Sie können eine Bibliothek finden, um mit Windows -API -Zeug im verwalteten Code umzugehen.
Laden Sie die DLL herunter und verweisen Sie sie in Ihrem Projekt und von dort aus können Informationen zu jedem gewünschten Fenster erhalten.

 void ForAllSystemWindows()
        {
            foreach (SystemWindow window in SystemWindow.AllToplevelWindows)
            {
                if (window.Title == string.Empty)
                {
                    //Found window without title

                    //Get window handle
                    IntPtr windowhandle  = window.HWnd;

                    //Do other stuff ..
                }
            }
        }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top