none
如何枚举子窗口句柄 RRS feed

答案

全部回复

  • DEAR

    怎老是您在问这问题...

    请善用搜寻工具百度跟谷哥啊

    http://www.baidu.com/s?wd=c%23+%C3%B6%BE%D9%D7%D3%B4%B0%BF%DA%BE%E4%B1%FA

    http://www.google.com.tw/search?hl=&q=c%23+%E6%9E%9A%E4%B8%BE%E5%AD%90%E7%AA%97%E5%8F%A3%E5%8F%A5%E6%9F%84&sourceid=navclient-ff&rlz=1B3GGLL_zh-TWTW400TW400&ie=UTF-8

    得到以下結果

    http://www.cnblogs.com/alex_itxz/archive/2010/09/15/1827156.html



    秘訣無它,唯勤而已
    2010年11月4日 6:56
  • Sample Code (C#):

        [DllImport("user32")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool EnumChildWindows(IntPtr window, EnumWindowProc callback, IntPtr i);

        /// <summary>
        /// Returns a list of child windows
        /// </summary>
        /// <param name="parent">Parent of the windows to return</param>
        /// <returns>List of child windows</returns>
        public static List<IntPtr> GetChildWindows(IntPtr parent)
        {
        List<IntPtr> result = new List<IntPtr>();
        GCHandle listHandle = GCHandle.Alloc(result);
        try
        {
            EnumWindowProc childProc = new EnumWindowProc(EnumWindow);
            EnumChildWindows(parent, childProc, GCHandle.ToIntPtr(listHandle));
        }
        finally
        {
            if (listHandle.IsAllocated)
            listHandle.Free();
        }
        return result;
        }

        /// <summary>
        /// Callback method to be used when enumerating windows.
        /// </summary>
        /// <param name="handle">Handle of the next window</param>
        /// <param name="pointer">Pointer to a GCHandle that holds a reference to the list to fill</param>
        /// <returns>True to continue the enumeration, false to bail</returns>
        private static bool EnumWindow(IntPtr handle, IntPtr pointer)
        {
        GCHandle gch = GCHandle.FromIntPtr(pointer);
        List<IntPtr> list = gch.Target as List<IntPtr>;
        if (list == null)
        {
            throw new InvalidCastException("GCHandle Target could not be cast as List<IntPtr>");
        }
        list.Add(handle);
        //  You can modify this to check to see if you want to cancel the operation, then return a null here
        return true;
        }

        /// <summary>
        /// Delegate for the EnumChildWindows method
        /// </summary>
        /// <param name="hWnd">Window handle</param>
        /// <param name="parameter">Caller-defined variable; we use it for a pointer to our list</param>
        /// <returns>True to continue enumerating, false to bail.</returns>
        public delegate bool EnumWindowProc(IntPtr hWnd, IntPtr parameter);
    我找来的代码,但是我完全不理解它们的参数是怎样传递的.
    要是我想输出枚举出的句柄要怎样做?


    2010年11月4日 7:33
  • DEAR

    你上一个问题~开心大不是已经给完整的范例了吗
    http://social.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/bd51e551-77af-44a9-b8b6-4d2594cfc947
    你有动手识做吗??


    秘訣無它,唯勤而已
    • 已标记为答案 a48625a 2010年11月4日 8:43
    2010年11月4日 7:45
  • 我早看过了,就是看不懂.我还没学过如何调用api,现在只学到使用一些c#的控件

    而且那个程序(http://social.microsoft.com/Forums/zh-CN/visualcshartzhchs/thread/bd51e551-77af-44a9-b8b6-4d2594cfc947 )我试了,按按键没反应

    2010年11月4日 8:31
  • 我按照limljh的方法可以了.

    但是我还想知道它们的参数是怎样传递的,我不想只是复制而不理解

    谢谢

    2010年11月4日 8:40
  • 我按照limljh的方法可以了.

    但是我还想知道它们的参数是怎样传递的,我不想只是复制而不理解

    谢谢

    Dear

    您是哪个地方不懂??

    看不懂方法传递参数??还是你的C#基本语法还不熟??是不是应该回去翻翻资料看看"方法"怎样写

    把每一个程序用中断短点逐行观察,只要你观察后发现有不懂的地方,再上来发问,我相信大家都很乐意帮助你

    你应该提早提出你不懂得地方,而不是这样绕一大圈,浪费彼此的时间


    秘訣無它,唯勤而已
    2010年11月4日 9:00