احصل على مقبض نافذة لا يوجد لديه عنوان .. (C #)

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

  •  19-09-2019
  •  | 
  •  

سؤال

كيف يمكننا الحصول على مقبض نافذة لا تحتوي على عنوان؟ هل هناك طريقة لتعداد جميع النوافذ على سطح المكتب وتصفية النافذة التي لا تحتوي على عنوان (في حالتي، هناك واحد فقط) والحصول على مقبضها .. أو عن طريق تحديد سمات أخرى مثل النافذة التي لديها زر معين أو ListBox الخ ...

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

المحلول

هذا يجب أن تفعل ذلك:

    ...
    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.

إرجاع WindowFrophoint مقبض، أو NULL إذا لم يكن هناك نافذة أسفل المؤشر. هل يمكن استخدام هذا، أم أنك تحاول أتمتة العملية؟

هنا يمكنك العثور على مكتبة للتعامل مع Windows API Stuff في التعليمات البرمجية المدارة.
قم بتنزيل 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