首页 > 代码库 > Net/WFP窗体枚举类

Net/WFP窗体枚举类

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows;
using System.Xml;

// author: andy , 20140521 
// WPF下窗体枚举
namespace DrawCanvas {
    public class XmalWinEnumHelper {
        private delegate bool EnumChildDelegateProc(IntPtr hWnd, IntPtr lParam);
        public struct POINT
        {
            public int X;
            public int Y;
            public POINT(int x, int y)
            {
                this.X = x;
                this.Y = y;
            }
        }
        
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool EnumChildWindows(IntPtr hwndParent, XmalWinEnumHelper.EnumChildDelegateProc lpEnumFunc, IntPtr lParam);
        [DllImport("user32.dll")]
        private static extern bool ScreenToClient(IntPtr hWnd, ref XmalWinEnumHelper.POINT lpPoint);
        [DllImport("user32.dll")]
        private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool IsWindowVisible(IntPtr hWnd);

        //=> FUNCITON
        public static List<int> GetChildWindows(IntPtr hWndParent) {
            List<int> list = new List<int>();
            GCHandle value = GCHandle.Alloc(list);
            XmalWinEnumHelper.EnumChildDelegateProc lpEnumFunc = new XmalWinEnumHelper.EnumChildDelegateProc(XmalWinEnumHelper.DoEnumChildWindowsProc);
            XmalWinEnumHelper.EnumChildWindows(hWndParent, lpEnumFunc, GCHandle.ToIntPtr(value));
            value.Free();
            list.Sort();
            return list;
        }
        private static bool DoEnumChildWindowsProc(IntPtr hWnd, IntPtr lParam) {
            List<int> list = GCHandle.FromIntPtr(lParam).Target as List<int>;
            if (list != null && XmalWinEnumHelper.IsWindowVisible(hWnd)) {
                list.Add(hWnd.ToInt32());
            }
            return true;
        }

        public static bool ConvertPointFromScreenToClient(IntPtr hWnd, ref System.Windows.Point pt) {
            if (hWnd.ToInt32() == 0) {
                return false;
            }
            XmalWinEnumHelper.POINT pOINT = new XmalWinEnumHelper.POINT((int)pt.X, (int)pt.Y);
            bool flag = XmalWinEnumHelper.ScreenToClient(hWnd, ref pOINT);
            if (flag) {
                pt.X = (double)pOINT.X / 1.0;
                pt.Y = (double)pOINT.Y / 1.0;
            }
            return flag;
        }
        public static string GetWindowTitle(IntPtr hWnd) {
            StringBuilder stringBuilder = new StringBuilder(512);
            XmalWinEnumHelper.GetWindowText(hWnd, stringBuilder, 512);
            return stringBuilder.ToString();
        }
    }
}