问题的解决思路就是使用EnumWindows遍历所有的顶级父窗口,对每个顶级父窗口使用EnumChildWindows遍历它的所有控件,每个控件其实也是窗口,拿到该控件的句柄后,就可以调用GetWindowText来获取文本信息了。

  具体实现时,首先需要定义以上API函数的回调函数代理:

/// <summary>
/// 回调函数代理
/// </summary>
  public delegate bool CallBack(int hwnd, int lParam);
然后必须针对每个API函数定义代理的实例函数:
/// <summary>
/// 进程回调处理函数
/// </summary>
/// <param name="hwnd"></param>
/// <param name="lParam"></param>
/// <returns></returns>
  public static bool ThreadWindowProcess(int hwnd, int lParam)
{
EnumChildWindows(hwnd,callBackEnumChildWindows, 0);
return true;
}
/// <summary>
/// 窗口回调处理函数
/// </summary>
/// <param name="hwnd"></param>
/// <param name="lParam"></param>
/// <returns></returns>
  public static bool WindowProcess(int hwnd, int lParam)
{
EnumChildWindows(hwnd,callBackEnumChildWindows, 0);
return true;
}
/// <summary>
/// 子窗口回调处理函数
/// </summary>
/// <param name="hwnd"></param>
/// <param name="lParam"></param>
/// <returns></returns>
  public static bool ChildWindowProcess(int hwnd, int lParam)
{
StringBuilder title = new StringBuilder(200);
int len;
len = GetWindowText(hwnd, title, 200);
if(len > 0)
{
if(title.ToString().IndexOf(GlobalManager.ErrorMessage) != -1 )
{
FindError = true;
}
}
return true;
}
最后要定义回调代理的实例
/// <summary>
/// 进程窗口回调函数代理
/// </summary>
  public static CallBack callBackEnumThreadWindows = new CallBack(ThreadWindowProcess);
/// <summary>
/// 窗口回调函数代理
/// </summary>
  public static CallBack callBackEnumWindows = new CallBack(WindowProcess);
/// <summary>
/// 子窗口回调函数代理
/// </summary>
  public static CallBack callBackEnumChildWindows = new CallBack(ChildWindowProcess);
使用的例子:
/// <summary>
/// 客户端是否弹出对话框
/// </summary>
/// <returns></returns>
  public bool IsClientPopupWindows()
{
bool FindError = false;
EnumWindows(callBackEnumWindows,0);
return FindError;
}

posted on 2009-07-19 04:25  阿C's  阅读(208)  评论(0)    收藏  举报