• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

c#枚举windows当前的所有窗口及子窗口

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

转: http://www.cnblogs.com/freedom831215/archive/2009/10/03/1577508.html

 

如何 找到桌面上报错的窗口,不管是父窗口还是子窗口,而且获得它的出错信息呢?

主要是利用API函数:
[DllImport("user32.dll")]
public static extern int FindWindowEx(int hwndParent, int hwndChildAfter,
    string lpszClass, string lpszWindow);
[DllImport("user32.dll")]
public static extern int FindWindow(string strclassName, string strWindowName);
[DllImport("user32.dll")]
public static extern int GetLastActivePopup(int hWnd);
[DllImport("user32.dll")]
public static extern int AnyPopup();
[DllImport("user32.dll")]
public static extern int GetWindowText(int hWnd, StringBuilder lpString, int nMaxCount);
[DllImport("user32.dll")]
public static extern int EnumThreadWindows(int dwThreadId, CallBack lpfn, int lParam);
[DllImport("user32.dll")]
public static extern int EnumWindows(CallBack lpfn, int lParam);
[DllImport("user32.dll")]
public static extern int EnumChildWindows(int hWndParent, CallBack lpfn, int lParam);

最关键的是对windows操作系统中窗口本质的认识,使用Spy++工具,查找窗口就可以发现,其实对于给定

的对话框窗口,其中的任何控件,如图标、文本、确定、取消按钮等都是它的子窗口,本质上还是窗口,

所不同的只是,顶级父窗口查找时,用FindWindow函数,而查找子窗口时用FindWindowEx。

另外比较有用的是EnumWindows,可以遍历所有的顶级父窗口,而EnumChildWindows则是遍历其子窗口。

经过测试,EnumThreadWindows的回调函数无法调用,不知道是什么原因,望高手指教。

所以问题的解决思路就是使用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;
}

 

注意!:

      当你的枚举程序为一个系统服务时,得把该服务的“允许服务于桌面交互”选项给勾上:如下图。

 

            

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#两个独立exe程序直接通信发布时间:2022-07-14
下一篇:
HTTP协议及其POST与GET操作差异&amp;C#中如何使用POST、GET等发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap