【蓝因子教育】一个 HOOK 的例子

【蓝因子教育】一个 HOOK 的例子

一、应用场景

封装一个 OCX 控件,该控件的作用是来播放一个视频文件,需要在一个进程中放置四个控件实例。 由于控件是提供给别人用的,因此需要考虑很多东西。

二、考虑因素

1、控件的父窗口 resize 时需要控件也随之 resize

子窗体不能知道父窗口的 resize 情况,因为父窗口不会主动把这一情况通知子窗口。 因此需要放一个钩子来主动得知父窗口的 resize 事件,然后告诉控件窗口做出适当的改变。

这里用了一个局部钩子,即线程钩子。 被放置钩子的线程是控件的父窗口所在的线程 (这也是考虑第 3 个因素的原因)

2、这四个控件是否为同一个父窗口

在该场景中考虑到了多个控件在同一个父窗口的情况:这种情况下,当父窗口 resize 的时候,就需要通知每一个控件 (子窗口)。 又因为多个控件的父窗口可能不是同一个,因此钩子就要被放置到每一个父窗口所在的线程。

3、执行四个控件 UI 相关代码的线程是否为同一个线程

由于控件的所在场景相对无法控制,因此控件的父窗口的代码有可能是在不同的线程中执行的 (虽然 99.999% 可能性是同一个线程),这就需要在每个不同的线程中放置一个钩子 (这基于一个前提,那就是 放置钩子的线程 == 执行钩子回调函数的线程)。

综合 3 个因素,可以得出这样一个 对应关系

一个线程 Thread: 被放置钩子的线程 == 控件的父窗口所在的线程 (可能这样说不准确,但权且这样说) == 执行钩子回调函数的线程

一个 Hook: 每放置一个钩子就产生一个 HOOK, 对于同一个线程只放置一次,如果四个控件的父窗口不是同一个线程,那么就要放置多个。还因为要在代码中使用 CallNextHook 将当前线程对应的钩子作为参数传给该函数,因此要保存线程和钩子的对应关系。

一个父窗口句柄: 即相同父窗口的控件的父窗口

若干个子窗口 (控件):同一个父窗口有多个子窗口

特别声明:[【蓝因子教育】一个 HOOK 的例子] 该文观点仅代表作者本人,今日霍州系信息发布平台,霍州网仅提供信息存储空间服务。

猜你喜欢

57项拟获奖!2025年度卫星导航定位科学技术奖评审结果公示(2025年授予的奖项)

依据《国家科学技术奖励条例》和《卫星导航定位科学技术奖奖励条例》,经中国卫星导航定位科学技术奖评审委员会评审,奖励委员会会议审定,评审结果如下: 2025年度卫星导航定位科技进步奖拟获奖项目28项,其中特等…

57项拟获奖!2025年度卫星导航定位科学技术奖评审结果公示(2025年授予的奖项)

青春作笔,乡土为卷:一位湖大青年的乡村振兴实践手记(乡土情怀作文800字高中)

谁能想到,两年前,这个常在国家级学术会议上发言的“科研新星”,还坐在北京中关村的写字楼里,参与修改国家级农业项目申报材料;而如今,他的衣服鞋子常沾着泥点,手机相册里存满了乡村孩子们纯真的笑脸。从繁华都市到鄂州…

青春作笔,乡土为卷:一位湖大青年的乡村振兴实践手记(乡土情怀作文800字高中)

美国万万没想到,国产C919大飞机,要换上国产发动机了(美国万万没想到中国速度再创奇迹)

不过,大家也都清楚,国产大飞机,虽然说是国产,但实际上国产化率并不是100%,还有很多领域,是依赖国外的技术的。所以他说的话,可信度是非常高的,并且也代表着接下来国产长江-1000A 发动机,将成为中国第…

美国万万没想到,国产C919大飞机,要换上国产发动机了(美国万万没想到中国速度再创奇迹)

你觉得刀郎宜昌演唱会的氛围如何 草坪变身“刀迷专属能量区”(刀郎对唱)

草坪,真没想到你也有出头的一天。宜昌奥体中心外那片草地,原本是城市的“边角料”,现在成了刀郎演唱会的主舞台。演唱会还没开场,草地上已经坐满了五湖四海的刀迷,各种小马扎、野餐垫、零食袋散落其间,空气里混着瓜子壳和兴奋的呼吸

你觉得刀郎宜昌演唱会的氛围如何 草坪变身“刀迷专属能量区”(刀郎对唱)

B站上线“AI原声翻译功能”,将加入日语等语言

自今年5月哔哩哔哩(以下简称B站)宣布将下架原国际版APP,与国内版合并为一个统一APP后,B站的出海下一步便引来各方关注。澎湃新闻记者获悉,B站公布其为服务海外用户自研的“AI原声翻译功能”以便海外用户更好…

B站上线“AI原声翻译功能”,将加入日语等语言