如何判断一个应用程序是MDI还是SDI

fengling2001 2009-07-13 09:23:28
我想监控一些应用程序,如何知道他们是MDI还是SDI,例如firefox 和 visual studio
...全文
38 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgke 2009-07-14
  • 打赏
  • 举报
回复
如果是.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;
}
}
hecker728 2009-07-14
  • 打赏
  • 举报
回复
这个貌似实现不了。。。
kuangfengnuhou 2009-07-14
  • 打赏
  • 举报
回复
占坑,等高手

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧