| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1597 人关注过本帖
标题:C++全局钩子里添加了通过控件句柄获取控件标题的代码,在获取时程序死机
只看楼主 加入收藏
asdfghj1992
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2013-5-8
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:7 
C++全局钩子里添加了通过控件句柄获取控件标题的代码,在获取时程序死机
我添加了一段通过某一控件的句柄,获取应用程序中某一窗口中的该控件标题,可是当程序运行到获取标题时程序就死机了,请大家帮忙看看
代码如下:
程序代码:
LRESULT CALLBACK ShellHookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
    if (nCode>=0)// Windows Created
    {
        const int MyMaxParentWinCount = 2;
        // 父窗口类名数组
        char *A_szClassName[MyMaxParentWinCount] =
        {
            "#32770","Button"
        };
        // 父窗口标题数组
        char *A_szWinName[MyMaxParentWinCount] =
        {
            "询问","是(&Y)"
        };

        // 首先求得顶级父窗口
        HWND hLastWins =FindWindow(A_szClassName[0], A_szWinName[0]);
        HWND hLastWinss = FindWindowEx(hLastWins, 0,
            "Static", NULL);
        char title[200];
        GetWindowText(hLastWinss, title, 200);//在这里死机
      
        char *t=title;
        char *pattern="小于成本";
        char *patter="小于最低销售价";
        char *isMatch1= strstr(t,pattern);
        char *isMatch2= strstr(t,patter);
        if(title!=NULL)
        {
            if (isMatch1!=NULL||isMatch2!=NULL)
            {
                /*MessageBox((HWND)isMatch1,NULL,NULL,NULL);*/

                // 逐次用FindWindowEx函数求出各级子窗口
                for(int i=1; i<MyMaxParentWinCount; i++)
                {
                    hLastWins = FindWindowEx(hLastWins, 0,
                        "Button", "是(&Y)");
                }       
                EnableWindow(hLastWins, false);
            }           
        }
    }

    return CallNextHookEx(g_hHookShell,nCode,wParam,lParam);
}

BOOL CQJHook1::SetHook()
{

    g_hHookShell = SetWindowsHookEx(WH_CALLWNDPROC, ShellHookProc,glhInstance,0);

    return g_hHookShell ? TRUE : FALSE;

}

BOOL CQJHook1::DestroyHook()
{
    if (g_hHookShell == NULL)
    {
        return FALSE;
    }

    UnhookWindowsHookEx(g_hHookShell);
    return TRUE;
}
CQJHook1::CQJHook1() //类构造函数
{
} 

CQJHook1::~CQJHook1()
{
    DestroyHook();
}

搜索更多相关主题的帖子: 应用程序 
2013-05-08 09:56
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:20 
估计 ShellHookProc 返回,GetWindowText都会卡死
当前消息是被挂钩到ShellHookProc 内部,而你又在ShellHookProc 内部GetWindowText,这时候再次产生一个消息,上一个消息都没有处理完成,导致GetWindowText 等待了


换一个方案吧

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-05-08 11:24
asdfghj1992
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2013-5-8
收藏
得分:0 
回复 2楼 yuccn
我换了一个方案你在帮我看看
代码:
程序代码:
BOOL CALLBACK EnumChildProc( HWND hwnd,LPARAM lParam)
{
    char title[200];
    GetWindowText(hwnd, title, 200);
    HWND _yesCode;
    char *t=title;
    char *pattern="小于成本";
    char *patter="小于最低销售价";
    char *isMatch1= strstr(t,pattern);
    char *isMatch2= strstr(t,patter);

    if (t == "是(&Y)")
    {
        _yesCode = hwnd;
    }
    if (isMatch1!=NULL||isMatch2!=NULL)
    {
        HWND k = _yesCode;       
        EnableWindow(k, false);
    }       
    return true;
}
LRESULT CALLBACK ShellHookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
    if (nCode>=0)// Windows Created
    {
        // 首先求得顶级父窗口
        HWND hLastWins =FindWindow("#32770","询问");
        if(hLastWins!=NULL)
        {
            EnumChildWindows(hLastWins,EnumChildProc,lParam);
        }
    }
    return CallNextHookEx(g_hHookShell,nCode,wParam,lParam);
}
谢谢了
2013-05-08 12:01
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
一样的,因为EnumChildWindows会等待EnumChildProc轮询的完成
如果是想获取某一控件的标题,应该不用那么麻烦的。

我以前发过一个工具,也提供了源代码,里面就有这样的实现

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-05-08 12:10
asdfghj1992
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2013-5-8
收藏
得分:0 
回复 4楼 yuccn
我是要通过那个控件的标题来判断是不是我需要的窗口控件。能不能给下下载地址你以前的工具
2013-05-08 13:21
yuccn
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:何方
等 级:版主
威 望:167
帖 子:6815
专家分:42393
注 册:2010-12-16
收藏
得分:0 
回复 5楼 asdfghj1992
那样直接枚举空间就行了,也不需要消息钩子。
直接枚举出控件,之后就GetWindowText。

如果是密码框就需要注入一下

我行我乐
公众号:逻辑客栈
我的博客:
https://blog.yuccn. net
2013-05-08 13:35
asdfghj1992
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2013-5-8
收藏
得分:0 
回复 6楼 yuccn
要是不用钩子可以达到一直监视,我需要修改的那个应用程序的功能吗?
2013-05-08 13:37
asdfghj1992
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2013-5-8
收藏
得分:0 
谢谢你我结贴了
2013-05-09 08:48
快速回复:C++全局钩子里添加了通过控件句柄获取控件标题的代码,在获取时程序死 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.046025 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved