文档章节

GetWindowText 卡死

阳666
 阳666
发布于 2016/03/25 12:28
字数 339
阅读 65
收藏 0

今天因为业务需要封装了一个函数:

int GenHwndByTitle(CString title,vector<HWND>& hwnds){

    int nCount = 0;

    // 获得首个handle.  

    HWND h = FindWindow(0,0);  

    // 循环查找直到找到为给定进程ID的窗口句柄  

    while( h != NULL)  

    {  

        //检查窗口句柄是否为顶级窗口  

        if( ::GetParent(h) == NULL )  

        {  

           tchar text[255];  

            ::GetWindowText(h,text,255);  

            CString str = CString(text);

            if ( str == title )

            {

                nCount++;

            }

            //有的有窗口 但无标题  

            /*if (strlen(text)>1)  

            {  

                printf("hwnd[%s]\n",text);  

            }  */

        }  

        // 取下一个窗口的句柄  

        //h = GetWindow(h, GW_HWNDNEXT);  

   h = GetWindow(h, GW_HWNDNEXT);          

}

    return nCount;

}

然后调试的时候发现死机了。(无响应,),后来查了下卡在了GetWindowText这里。

原因网上有很多:

    // 会卡机,有可能是获取自身窗体标题会卡住。。系统无线等待。。死锁了。

解决办法:

//https://msdn.microsoft.com/en-us/library/windows/desktop/ms633523(v=vs.85).aspx

使用新API:InternalGetWindowText替换GetWindowText


就像下面这样

//通过窗口获取句柄

int GenHwndByTitle(CString title,vector<HWND>& hwnds){

    int nCount = 0;

    // 获得首个handle.  

    HWND h = FindWindow(0,0);  

    // 循环查找直到找到为给定进程ID的窗口句柄  

    while( h != NULL)  

    {  

        //检查窗口句柄是否为顶级窗口  

        if( ::GetParent(h) == NULL )  

        {  

            TChar text[255];  

            ::GetWindowText(h,text,255);  

            CString str = CString(text);

            if ( str == title )

            {

                nCount++;

            }

            //有的有窗口 但无标题  

            /*if (strlen(text)>1)  

            {  

                printf("hwnd[%s]\n",text);  

            }  */

        }  

        // 取下一个窗口的句柄  

        //h = GetWindow(h, GW_HWNDNEXT);  

   h = InternalGetWindow(h, GW_HWNDNEXT);          

}

    return nCount;

}

问题解决

         


© 著作权归作者所有

共有 人打赏支持
阳666
粉丝 4
博文 75
码字总数 62734
作品 0
长宁
程序员
一款上网拨号程序的设计-----vc+篇

现在的时代是网络的时代,网络应用程序的应用越来越广泛,在自己设计的应用程序中实现直接拨号上网,给应用程序的使用者带了很多方便与惊喜。 环境:window7 操作系统 vc+6.0开发 首先创建一...

crossmix
2015/12/18
9
0
python3如何获得前端显示窗口的句柄?

我只知道以下代码可以显示所有的可见窗口. 但是我想要前端显示的窗口,应该怎么做? from win32gui import * titles = set() def foo(hwnd,nouse): if IsWindow(hwnd) and IsWindowEnabled(hw...

FakeThinker
2014/07/02
1K
0
Delphi 查找标题已知的窗口句柄,遍历窗口控件句柄(转)

Delphi 查找标题已知的窗口句柄,遍历窗口控件句柄(转) 用我的方法来控制其他程序窗体上的窗口控件,必须先了解什么是回调函数。我的理解是这样的: 回调函数写出来不是自己的程序去调用的,...

vga
2015/02/05
0
0
spring+maven+mybatis的单元测试卡死,求解!

前几天还好好的,由于去搞另外一个单点登录的框架,加了一些新功能,然后再回来做这个项目发现自己的单元测试跑不起来了,各种卡死,困扰我一天了0 0,求解啊啊啊啊! 这是src/test/resource...

Catelyn
2013/11/05
877
3
springmvc+hibernate开启事务时卡死

使用springmvc+hibernate部署的一个web项目,在windows下可以正常访问数据库,迁移到mac或者Linux时就卡死,下面贴出卡死处部分代码: 卡死处为访问数据库工具类(com.spring.db.DbManager...

one_day
2016/08/05
86
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

人生苦短:Python里的17个“超赞操作

人生苦短,我选Python”。那么,你真的掌握了Python吗? 1. 交换变量 有时候,当我们要交换两个变量的值时,一种常规的方法是创建一个临时变量,然后用它来进行交换。比如: # 输入 a = 5 b ...

糖宝lsh
42分钟前
4
0
咕泡-spring中常用设计模式概述

设计模式就是经验之谈,供后人借鉴,解决一些具有代表性的问题 设计模式来源于生活,反过来帮助我们更好生活 设计模式提升代码的可读性、可扩展性、维护成本、复杂业务问题 千万不要死记硬背...

职业搬砖20年
今天
2
0
day59-20180817-流利阅读笔记-待学习

假·照骗,真·社交焦虑 雪梨 2018-08-17 1.今日导读 发朋友圈之前,不少人为了展现更美好的生活状态会对照片加以“微调”,或是加个滤镜显得逼格更高,或是磨个皮瘦个脸拉个大长腿。现在,国...

aibinxiao
今天
19
0
OSChina 周五乱弹 —— 姑娘在这个节日里表白你接受么?

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @Sharon啊:完全被这个小姐姐圈粉了,学两首她的歌去哈哈 分享王贰浪的单曲《往后余生(翻自 马良)》 《往后余生(翻自 马良)》- 王贰浪 手...

小小编辑
今天
949
16
为什么HashMap要自己实现writeObject和readObject方法?

为什么HashMap要自己实现writeObject和readObject方法? 如果你有仔细阅读过HashMap的源码,那么你一定注意过一个问题:HashMap中有两个私有方法。 private void writeObject(java.io.Objec...

DemonsI
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部