Получите ручку окна, в котором нет заголовка .. (C#)

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

  •  19-09-2019
  •  | 
  •  

Вопрос

Как мы можем получить ручку окна, в котором нет заголовка? Есть ли способ перечислять все окна на рабочем столе и отфильтровать окно, в котором нет заголовка (в моем случае, есть только один) и получение его ручки ... или указав другие атрибуты, такие как окно, которое имеет конкретная кнопка или списка и т. Д.

Это было полезно?

Решение

Это должно это сделать:

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

    }
}

Другие советы

Взгляните на функцию EnumChildWindows.

Я думаю, что если вы передадите в указатель главного окна (т.е. настольный компьютер) на эту функцию, вы сможете получить список всех окон и их детских окон.

В сочетании с FindWindow должно быть возможно доставить ручку в окно, которое вы хотите, после того, как вы найдете ожидаемый контроль над ребенком.

Что -то подобное должно работать, не испытано

[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

Window -Frompoint возвращает ручку или нулевой, если под вашим курсором нет окна. Можно ли это использовать, или вы пытаетесь автоматизировать процесс?

Здесь Вы можете найти библиотеку для работы с Windows API в управляемом коде.
Загрузите DLL и укажите его в свой проект, и оттуда очень легко получить какую -либо информацию в любом окне, которое вы хотите;

 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 ..
                }
            }
        }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top