VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 693|回复: 12

怎么建立qq聊天窗口打开文件夹的钩子?

[复制链接]
16_avatar_middle
最佳答案
0 
在线会员 发表于 2019-8-29 16:45:51 | 显示全部楼层 |阅读模式
本帖最后由 liuzhaoyzz 于 2019-8-29 17:10 编辑

怎么建立qq聊天窗口打开文件夹的钩子?
我用spy++看了下消息,只有WM_LBUTTONDOWN,问题是拦截这个消息之后,又怎么确认是点击了这个“打开文件夹”按钮的呢?如果点击了打开这个按钮一样也是WM_LBUTTONDOWN啊?都是一个hwnd。
<00840> 004D03CA S WM_SETCURSOR hwnd:004D03CA nHittest:HTCLIENT wMouseMsg:WM_LBUTTONDOWN
网上看了下,似乎更适合用鼠标低级钩子:WH_MOUSE_LL
VC6捕获鼠标事件(移动、单击等)的一些总结(MFC消息、DriectInput、钩子) - 唐林的专栏 - CSDN博客 https://blog.csdn.net/wumuzhizi/article/details/46341311
一样存在怎么确认是点击了这个“打开文件夹”按钮。
QQ截图20190829163626.jpg




上一篇:如何解决定时关机在关闭监视器、关闭硬盘、系统待机的状态下,仍然能够定时关机?
下一篇:mfc 中出现控件 未定义标识符错误,但是程序能正常运行。请问怎么改?见图
16_avatar_middle
最佳答案
0 
在线会员 发表于 2019-8-29 17:54:47 | 显示全部楼层
WM_LBUTTONDOWN是Windows鼠标左键按下的消息,你spy++的只是整个窗口的句柄,QQ用的是DirectUI,无法获取某个按钮的单击事件。目前想到的有两种方法:EnumWindow和send。
51_avatar_middle
最佳答案
84 
online_admins 发表于 2019-8-29 22:18:24 | 显示全部楼层
试试用 Microsoft Active Accessibility 看能不能截获到!
https://www.cnblogs.com/SadlyCodes/p/3472406.html
16_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-8-30 08:18:59 | 显示全部楼层
       我看了介绍,基于IAccessible接口,这个技术楼主现在已经封装成DLL免费开放给大家使用了,有爱UI助手是一款.NET下的易用,强大,稳定的GUI自动化操作库。
我看了demo,QQ消息助手(源码):
依靠有爱UI助手库提供的函数功能,您可以获取到最近接收到的所有消息。在这个DEMO中,实现了在收到包含指定关键词的消息时,自动弹出提醒和保存消息的功能。

似乎可以实现抓取聊天窗口的消息和特定的文字。
有没有vc++的,因为源代码是基于c++的,而且是个小工具,不希望牵涉到.net。
16_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-8-30 08:38:16 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2019-8-30 09:07 编辑
firefox 发表于 2019-8-29 17:54
WM_LBUTTONDOWN是Windows鼠标左键按下的消息,你spy++的只是整个窗口的句柄,QQ用的是DirectUI,无法获取某 ...


        确实是如你所说的情况。EnumWindow层层查找也只能找到这个窗体hwnd吧,我看了其类名是“TXGuiFoundation”,是桌面下的二级窗口,然后这里面的按钮又怎么检测到被点击?愿闻其详,谢谢!
网上搜了下,传统的Win32控件由于其消息、原理公开,使得通过一些简单的Hook或其他方式可以很容易破解软件。而一个完全的DirectUI界面,其界面元素及内部逻辑完全为私有实现,外界无从得知。这就使得破解变得困难的多。
DirectUI更难以hook吧。
QQ的主窗体实现是一个DirectUI的方式,在皮肤目录下有个config.xml,还有个脚本文件.vbs 的VB脚本。 这方面进来接触了些,有时间可能会做个比较完整的出来。 主要就是分割区域然后画了,至于他们怎么知道位置,很简单,里面有对象来处理这些,比如你的鼠标在(x,y)单击了一下,父窗口就会向所有的子对象(内部对象,没有Handle属性)转发这个消息,或者查找位于这个位置的最上层对象,然后转发消息给他,这样就可以做到那个对象响应这个消息了(和 Button处理方式一样,只是没有句柄了,也不依赖以Windows来分发消息)。至于WM_Paint消息比较好处理,父窗口先将底色画好,然后就分发这个消息给所有子对象,子对象根据自己记录的位置和范围,在指定的 Rect中画好自己的东西就可以了。大致就是这样,虽然是很炫的玩意,但还是基于原来的技术的。


问了个类似软件的作者,他叫我搜索shellmsghook技术,不懂,网上也没有搜到相关知识。。。

19_avatar_middle
最佳答案
0 
在线会员 发表于 2019-8-30 09:13:14 | 显示全部楼层
Syc 发表于 2019-8-29 22:18
试试用 Microsoft Active Accessibility 看能不能截获到!
https://www.cnblogs.com/SadlyCodes/p/3472406 ...

2009-8-30
2019-8-30
16_avatar_middle
最佳答案
0 
在线会员 发表于 2019-8-30 09:57:34 | 显示全部楼层
liuzhaoyzz 发表于 2019-8-30 08:38
确实是如你所说的情况。EnumWindow层层查找也只能找到这个窗体hwnd吧,我看了其类名是“TXGuiF ...

通过句柄,去向下遍历,得到标题,与你想要的标题CMP,具体的还得楼主自己去想,自己去多多实验。楼主提出的是一个特定的、有局限性的任务。我也没有太多的时间去尝试搞TXGuiFoundation,建议楼主把基础好好学学,搞出来也挣不到多少钱。把基础功学扎实才重要。
16_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-8-30 10:05:53 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2019-8-30 10:26 编辑

Syc 发表于 2019-8-29 22:18
试试用 Microsoft Active Accessibility 看能不能截获到!
https://www.cnblogs.com/SadlyCodes/p/3472406 ...


基于基于IAccessible接口的QQ窗口信息获取的实现,我看了IAccessible接口相关资料,然后用inspect.exe枚举了下,似乎可以枚举所有的消息窗口,但是文件发送后的打开、打开文件夹那个窗口枚举不了。
AccessibleObjectFromPoint
http://msdn.microsoft.com/en-us//library/ms696163
IAccessible
http://msdn.microsoft.com/en-us/library/ms696165
QQ截图20190830100743.jpg
QQ截图20190830102559.jpg
16_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-8-30 10:13:39 | 显示全部楼层
firefox 发表于 2019-8-30 09:57
通过句柄,去向下遍历,得到标题,与你想要的标题CMP,具体的还得楼主自己去想,自己去多多实验。楼主提 ...

       你说的方法,似乎不适用于directUI,你看下我上图用inspect.exe枚举的窗口,都是null,很难用常规的方法枚举并比较。inspect.exe适合枚举directUI库的应用。
16_avatar_middle
最佳答案
0 
在线会员 发表于 2019-8-30 10:24:54 | 显示全部楼层
liuzhaoyzz 发表于 2019-8-30 10:13
你说的方法,似乎不适用于directUI,你看下我上图用inspect.exe枚举的窗口,都是null,很难用常规 ...

只要想做,就没有什么做不了的,楼主问的问题太有局限性了,我们大家不一定做过类似的项目,也没有时间去尝试。多找一些源码看看吧。找到方法希望能分享给我们大家。
16_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-8-30 10:29:23 | 显示全部楼层
      
只要想做,就没有什么做不了的

这是肯定的,问题是如果实现起来太难,成本太高,就算了。

可能需要更换hook api的思路。因为已经有人已经实现了拦截qq文件发送那个“打开文件夹”按钮的功能,软件是闭源的,作者不愿意公开更多细节,只告诉我一个关键字“shellmsghook”,我找了没有找到任何相关资料。
98_avatar_middle
最佳答案
0 
online_moderator 发表于 2019-9-23 23:12:59 | 显示全部楼层
这种功能开发,直接HOOL QQ的 接受打开文件实现函数,通过OD hook 文件夹打开有关函数,回溯找到你需要的hook的功能点,这样子才是比较直接方法。
如果你只是想打开文件夹改成你自己目录,那么hook QQ 调用哪个系统 API,直接HOOK那个系统API即可。
16_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-10-15 13:47:52 | 显示全部楼层
本帖最后由 liuzhaoyzz 于 2019-10-15 15:47 编辑

那个软件作者透漏了关键部分的源代码,我分享出来。

//ShellHook Message
        m_shellHookMsg = RegisterWindowMessage(_T("SHELLHOOK"));
        RegisterShellHookWindow(GetHWND());


LRESULT CMainMsgWnd::HandleMessage(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
        LRESULT lRes = 0;
        BOOL bHandled = TRUE;
       
        //////////////////////////////////////////////////////////////////////////
        //动态消息

       
        if (m_shellHookMsg == uMsg)
        {
                //SHELL 消息
                OnShellHookMsg(wParam, lParam);
                return lRes;
        }
...


//////////////////////////////////////////////////////////////////////////
// SHELL 消息
//////////////////////////////////////////////////////////////////////////
void CMainMsgWnd::OnShellHookMsg(WPARAM wParam, LPARAM lParam)
{
        HWND hwnd = (HWND)lParam;

        switch (wParam)
        {

        case HSHELL_WINDOWCREATED:
        {
                //创建窗口
                GetPublicRes().GetExplorerWinMgr()->OnShellMsg_WindowCreate(hwnd);
        }
        break;

                //窗口激活
        case HSHELL_ACTIVATESHELLWINDOW:
        case HSHELL_WINDOWACTIVATED:
        case HSHELL_RUDEAPPACTIVATED:
        {
                GetPublicRes().GetExplorerWinMgr()->OnShellMsg_WindowActived(hwnd);
        }
        break;


        case HSHELL_ENDTASK:
        {
...
        }
        break;

        default:
                break;
        }
}

shellmsg 只有 窗口激活 窗口创建 窗口关闭 这几个通知
然后自己处理
他能返回所有窗口的通知
hook 是windows提供的功能,和你用什么UI库没关系
directui没有句柄啊,hook不是要句柄的吗
没有窗口句柄 ,但是可以创建不可见的窗口啊
这个窗口只负责消息处理
这个只能接收到 窗口的变动,不能检测到你执行了什么操作
相关的片段 就是这些了
其实你百度一下 RegisterWindowMessage(_T("SHELLHOOK"));
就能知道怎么用了

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2021-5-9 04:03

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表