最近朋友让我写一个屏幕取词的小工具,考虑了一下主要步骤大致如下:
1.下全局鼠标钩子,Hook鼠标WM_MOUSEMOVE消息
2. WM_MOUSEMOVE消息函数中设定时器,判断鼠标停留时间
3.触发定时器事件,注DLL到目标进程(鼠标停留进程),可根据鼠标位置判断目标进程(GetWindowThreadProcessId),DLL中Hook目标进程的某些函数,如ExtTextOutW等;
4.使目标进程控件强制刷新,以此触发字符串显示函数
5.将Hook到的字符串通过(管道、共享内存、消息)等方式传回屏幕取词进程
6.卸载目标进程注入的DLL(取消函数钩子)
理论上并不复杂,但在实现时发现不同窗体的绘制函数都不一样,Hook和强制刷新存在一定难度,效率也比较低,甚至可能都不如暴力搜索内存效率高,就退而求其次先写了一个屏幕划词的小东西。
屏幕划词比屏幕取词难度就小很多,设置某个热键,触发热键按下事件时通过剪贴板过度选中的词,然后显示出来,我实现的主要步骤如下: