屏幕划词的实现

最近朋友让我写一个屏幕取词的小工具,考虑了一下主要步骤大致如下:

1.下全局鼠标钩子,Hook鼠标WM_MOUSEMOVE消息

2. WM_MOUSEMOVE消息函数中设定时器,判断鼠标停留时间

3.触发定时器事件,注DLL到目标进程(鼠标停留进程),可根据鼠标位置判断目标进程(GetWindowThreadProcessId),DLL中Hook目标进程的某些函数,如ExtTextOutW等;

4.使目标进程控件强制刷新,以此触发字符串显示函数

5.将Hook到的字符串通过(管道、共享内存、消息)等方式传回屏幕取词进程

6.卸载目标进程注入的DLL(取消函数钩子)

理论上并不复杂,但在实现时发现不同窗体的绘制函数都不一样,Hook和强制刷新存在一定难度,效率也比较低,甚至可能都不如暴力搜索内存效率高,就退而求其次先写了一个屏幕划词的小东西。

屏幕划词比屏幕取词难度就小很多,设置某个热键,触发热键按下事件时通过剪贴板过度选中的词,然后显示出来,我实现的主要步骤如下:

继续阅读屏幕划词的实现

关于列举进程Module的那点小事儿

列举进程对应Module其实是个比较常见的问题,最开始想到的是TlHelp32.h头文件里的Module32First和Module32Next函数,代码很简单:

但是运行起来会发现,通过这套函数在编译成64位的时候,读32位的程序的Module会出错

继续阅读关于列举进程Module的那点小事儿