我想监控一些应用程序,如何知道他们是MDI还是SDI,例如firefox 和 visual studio

解决方案 »

  1.   

    如果是.NET 的 可以通过实例句柄来判断..非.NET的使用API 参考     public class Class1
            {
                private delegate bool EnumWindowsProc(IntPtr p_Handle, int p_Param);            [DllImport("user32.dll")]
                private static extern int EnumChildWindows(IntPtr hWndParent, EnumWindowsProc ewp, int lParam);            [DllImport("user32.dll")]
                private static extern int EnumWindows(EnumWindowsProc ewp, int lParam);            [DllImport("User32.dll", CharSet = CharSet.Auto)]
                private static extern int GetClassName(IntPtr hWnd, out STRINGBUFFER ClassName, int nMaxCount);            [DllImport("user32.dll", SetLastError = true)]
                private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);            [DllImport("user32.dll")]
                private static extern bool IsWindowVisible(IntPtr hWnd);
                [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
                private struct STRINGBUFFER
                {
                    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 512)]
                    public string szText;
                }
                private static IList<IntPtr> m_WindowsList;
                private static IntPtr m_Statusbar;            private static bool m_IsMdi = false;      
                /// <summary>
                /// 获取所有窗体
                /// </summary>
                /// <returns></returns>
                public static Dictionary<IntPtr, string> LoadWindows()
                {
                    m_WindowsList = new List<IntPtr>();
                    m_Statusbar = FindWindow("Shell_TrayWnd", "");
                    EnumWindowsProc _EunmWindows = new EnumWindowsProc(NetEnumWindows);
                    EnumWindows(_EunmWindows, 0);                Dictionary<IntPtr, string> _Return = new Dictionary<IntPtr, string>();
                    EnumWindowsProc _EunmControl = new EnumWindowsProc(NetEnumControl);
                    foreach (IntPtr _Windows in m_WindowsList)
                    {
                        m_IsMdi = false;
                        EnumChildWindows(_Windows, _EunmControl, 0);                    if (m_IsMdi)
                        {
                            _Return.Add(_Windows, "MDI");
                        }
                        else
                        {
                            _Return.Add(_Windows, "SDI");
                        }
                    }
                    return _Return;
                }            
                private static bool NetEnumWindows(IntPtr p_Handle, int p_Param)
                {
                    if (!IsWindowVisible(p_Handle))return true;
                    if (p_Handle == m_Statusbar) return true;
                    m_WindowsList.Add(p_Handle);
                    return true;
                }            private static bool NetEnumControl(IntPtr p_Handle, int p_Param)
                {
                    STRINGBUFFER _ClassName = new STRINGBUFFER();
                    GetClassName(p_Handle, out _ClassName, 255);
                    if (_ClassName.szText == "MDIClient")
                    {
                        m_IsMdi = true;
                    }
                    return true;
                }
            }