现在的位置: 首页 > 综合 > 正文

.NET Compact Framework 1.x 下实现窗口枚举(替代EnumWindows)

2013年12月23日 ⁄ 综合 ⁄ 共 1283字 ⁄ 字号 评论关闭

.net CF 1.x 是不支持CallBack(回调)的,所以我们无法用EnumWindows 这个API函数来枚举系统当前所有运行程序的窗口,这里我们可以通过其它的API函数来实现EnumWindows 的功能。(.net CF 2.0中就已经支持CallBack了,无奈.net CF2 还不够普及,这对用.net CF进行windows mobile开发的人来说限制是致命的,我们不得不费很多的精力去实现本来很简单的功能,这也是我为自己blog取名为“历险”的原因,因为在.net CF开发过程中有很多始料未及的问题,并非是技术原因,而是.net CF1.x本身的问题——封装太差)
public static Window[] EnumerateTopWindows()

{

      ArrayList winList = new ArrayList();

      IntPtr hwnd = IntPtr.Zero;

      Window window = null;

      StringBuilder sb = null;

      // 获取第一个窗口

      hwnd = GetActiveWindow();

      hwnd = GetWindow(hwnd, GW_HWNDFIRST);

      while(hwnd != IntPtr.Zero)

      {     

            IntPtr parentWin = GetParent(hwnd);

            // Make sure that the window doesn't have a parent

            if ((parentWin == IntPtr.Zero))

            {

                  int length       = GetWindowTextLength(hwnd);

                  // 检验是否为有效的窗体

                  if (length > 0)

                  {

                        window = new Window();

                        window.Handle = hwnd;

                        sb = new StringBuilder(length + 1);

                        GetWindowText(hwnd, sb, sb.Capacity);

                        window.Caption = sb.ToString();

                        winList.Add(window);

                  }

            }

                  

            hwnd = GetWindow(hwnd, GW_HWNDNEXT);

      }

      return (Window[])winList.ToArray(typeof(Window));

}

抱歉!评论已关闭.