Question

Comment peut-on obtenir la poignée d'une fenêtre qui ne dispose pas d'un titre? Est-il possible d'énumérer toutes les fenêtres sur le bureau et filtrer la fenêtre qui ne dispose pas d'un titre (dans mon cas, il n'y a qu'un seul) et d'obtenir la poignée de celui-ci .. ou en spécifiant d'autres attributs comme une fenêtre qui a un bouton spécifique ou listbox etc ...

Était-ce utile?

La solution

Cela devrait le faire:

    ...
    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);
        }

    }
}

Autres conseils

Jetez un oeil à la fonction EnumChildWindows.

Je pense que si vous passez le pointeur de la fenêtre principale (à savoir le bureau) à cette fonction, vous serez en mesure d'obtenir une liste de toutes les fenêtres et leurs fenêtres enfants.

En combinaison avec FindWindow il devrait être possible d'obtenir la poignée de la fenêtre que vous voulez une fois que vous localiser un contrôle enfant attendu.

Quelque chose comme cela devrait fonctionner, non testé

[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/ fr-fr / bibliothèque / ms633558 (VS.85) .aspx

WindowFromPoint renvoie une poignée, ou null si aucune fenêtre est sous votre curseur. Cela pourrait-il être utilisé, ou que vous essayez d'automatiser le processus?

vous pouvez trouver une bibliothèque pour traiter avec Windows stuff API en code managé.
Télécharger le dll et la référence dans votre projet et à partir de là, il est très facile à obtenir des informations sur une fenêtre que vous voulez;

 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 ..
                }
            }
        }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top