读取TDrawGrid之获取博易数据

朋友叫我帮忙写个从博易读取数据的工具,可无奈数据所在控件并不是Windows标准控件,也就是说没办法通过发送系统消息来获取
相关数据,于是乎试了一下从内存直接读取,可最后并不能达到预期目的,原因是笔者并不能从内存中找出和TDrawGrid对应的关系。
(如果有网友知道的可以赐教。)
最后实在没办法了,直接用上了Hook API,有的网友可能想到了,Hook Gdi32.dll中相应的文本输出函数,没错,我选择的是TextOutA。
思路如下:
1. 编写一个Dll,用于注入博易并Hook TextOutA。
BOOL TextOut(
HDC hdc, // 设备描述表句柄
int nXStart, // 字符串的开始位置 x坐标
int nYStart, // 字符串的开始位置 y坐标
LPCTSTR lpString, // 字符串
int cbString // 字符串中字符的个数
);
我们可以通过WindowFromDC来获取hdc相应的窗口的hWnd,并通过GetClassName来获取窗口的类,从而来判断当前所绘画的文本是不是输入TDrawGrid。
获取完数据后,通过WM_COPYDATA消息来发送相应的lpString到目标处理工具。
2. 编写用于接收数据的客户端。
部分代码如下:
__TextOutA proc hdc:DWORD,nXStart:DWORD,nYStart:DWORD,lpString:DWORD,cbString
local cds:COPYDATASTRUCT
local hwnd:DWORD invoke RestoreApi,hid_TextOutA,1
invoke WindowFromDC,hdc
mov hwnd,eax
invoke GetClassName,hwnd,offset szClassName,255
mov eax,offset szClassName
mov eax,[eax]
.if eax==061724454h
invoke IsWindowVisible,hwnd
.if eax
invoke FindWindow,0,offset szMainRecv
.if eax
push esi
push eax mov esi,offset sBuffer
invoke RtlZeroMemory,esi,255 mov eax,nXStart
mov [esi],eax
mov eax,nYStart
mov [esi+4],eax mov eax,esi
add eax,8 invoke RtlMoveMemory,eax,lpString,cbString mov eax,cbString
add eax,8
mov cds.cbData,eax
mov cds.lpData,esi
mov cds.dwData,0
invoke GetPixel,hdc,1,1
mov cds.dwData,eax pop eax
push ebx
mov ebx,eax
invoke SendMessage,ebx,WM_COPYDATA,0,addr cds
pop ebx pop esi
.endif
.endif
.endif invoke TextOut,hdc,nXStart,nYStart,lpString,cbString
invoke RestoreApi,hid_TextOutA,0
ret
__TextOutA endp
Public Function InterceptedCallBack(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If uMsg = WM_COPYDATA Then
Dim cbs As COPYDATASTRUCT
Dim md As MyData CopyMemory ByVal VarPtr(cbs), ByVal lParam, Len(cbs)
CopyMemory ByVal VarPtr(md), ByVal cbs.lpData, cbs.cbData
Debug.Print Hex(cbs.dwData), md.x, md.y, StrConv(md.d, vbUnicode)
End If
InterceptedCallBack = CallWindowProc(PrevWndProc, hwnd, uMsg, wParam, lParam)
End Function
VB+Asm代码,比较粗糙,见谅。
然而,TextOutA对于屏幕能看到的才画出来,那么整个TDrawGrid那么多行,要怎么获取所有的数据呢?
笔者通过SendMessage,发送相关滚动条的事件,来达到刷新整个TDrawGrid的目的,这样就OK了。
当然,这样获取到的数据是十分零散的,如下:
12 355 07-01 09:24
122 355 48860
204 355 48860
286 355 48860
368 355 48860
462 355 0
535 355 3058
12 380 07-01 09:25
122 380 48860
204 380 48860
286 380 48860
368 380 48860
462 380 0
535 380 3058
12 405 07-01 09:26
122 405 48860
204 405 48860
286 405 48860
368 405 48860
462 405 0
535 405 3058
12 355 07-01 09:26
122 355 48860
204 355 48860
286 355 48860
368 355 48860
462 355 0
535 355 3058 .......
.......
.......
但实际上只要稍微观察,还是能找出规律,很容易地就能整理数据了。
下面是获取、整理并转换为excel文档的效果图:

OK,收工了。
读取TDrawGrid之获取博易数据的更多相关文章
- 获取博客积分排名,存入数据库,读取数据进行绘图(python,selenium,matplotlib)
该脚本的目的:获取博客的排名和积分,将抓取时间,排名,积分存入数据库,然后把最近的积分和排名信息进行绘图,查看积分或者排名的变化情况. 整个脚本的流程:是利用python3来编写,利用selnium获 ...
- 程序间获取ALV显示数据(读取ALV GRID上的数据)
程序间获取ALV数据的两种方法: 方法1:通过修改SUBMIT的目标程序,把内表EXPORT到内存,SUBMIT后IMPORT ,该方法需要修改目标程序,可以任意设置目标程序的中断点: * Execu ...
- 以多进程读取oss符合条件的数据为例,综合使用多进程间的通信、获取多进程的数据
import datetime import sys import oss2 from itertools import islice import pandas as pd import re im ...
- js进阶ajax读取json数据(ajax读取json和读取普通文本,和获取服务器返回数据(链接)都是一样的,在url处放上json文件的地址即可)
js进阶ajax读取json数据(ajax读取json和读取普通文本,和获取服务器返回数据(链接)都是一样的,在url处放上json文件的地址即可) 一.总结 ajax读取json和读取普通文本,和获 ...
- OpenGL ES无法获取贴图数据原因
最近在做一个项目,要从贴图中获取图像数据,查了很多资料,也琢磨很久,获取到的数据都是0.终于在一次偶然的机会,发现了端倪,成功了. 不得不说这"一分灵感"真的很重要 以下是在获取贴 ...
- 使用腾讯开发平台获取QQ用户数据资料
<今天是七夕:祝大家七夕嗨皮,前可么么哒,后可啪啪啪> Tips:本篇博客将教你如何使用腾讯开发平台获取QQ用户资料 ----------------------------------- ...
- java 正则表达式的应用:读取文件,获取其中的电话号码
1.正则表达式 正则表达式,又称正规表示法.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式使用单个字符串来描 ...
- ajax post data 获取不到数据,注意 content-type的设置
ajax post data 获取不到数据,注意 content-type的设置 .post/get关于 jQuery data 传递数据.网上各种获取不到数据,乱码之类的.好吧今天我也遇到了,网 ...
- jQuery获取JSON格式数据方法
getJSON方法: jQuery.getJSON(url,data,success(data,status,xhr)) $("button").click(function(){ ...
随机推荐
- bzoj1878--离线+树状数组
这题在线做很麻烦,所以我们选择离线. 首先预处理出数组next[i]表示i这个位置的颜色下一次出现的位置. 然后对与每种颜色第一次出现的位置x,将a[x]++. 将每个询问按左端点排序,再从左往右扫, ...
- Is-A,Has-A,Use-A(转载)
原文地址:http://blog.csdn.net/loveyou128144/article/details/4749576 而Is-A,Has-A,Use-A则是用来描述类与类之间关系的.简单的说 ...
- 1、Python基本概念
1.数 python中有4种类型的数--整数.长整数.浮点数和复数 2.字符串 单引号.双引号或者三引号包含的字符序列,如: 'char' #单引号 "char" #双引号 ''' ...
- Web前端资源汇总
本文地址:http://www.cnblogs.com/jihua/p/webfront.html 网页特效库 2017新年快乐特效 CSS3+jQuery实现时钟插件 Html5入门实例" ...
- 如何用CSS画三角形
很多时候页面都需要一个或者多个小型三角形!多数人直接用PS扣个图片预览 下面用CSS简单画几个最终效果如下图 <div class="border-all-color"> ...
- html5 canvas 详细使用教程
转载自 http://www.cnblogs.com/tim-li/archive/2012/08/06/2580252.html 前言 基本知识 绘制矩形 清除矩形区域 圆弧 路径 绘制线段 绘制贝 ...
- arcgis api for js共享干货系列之二自定义Navigation控件样式风格
arcgis api for js默认的Navigation控件样式风格如下图: 这样的风格不能说不好,各有各的爱好,审美观,这里也不是重点,这里的重点是如何自定义一套自己喜欢的样式风格呢:自己自定义 ...
- 【代码笔记】iOS-验证手机号,邮箱,车牌号是否合法
一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ...
- CentOS7 修改防火墙,增加外网可以访问的端口号
CentOS7 修改防火墙,增加外网可以访问的端口号: vim /etc/sysconfig/iptables 增加一条 -A INPUT -p tcp -m state --state NEW -m ...
- 看看C# 6.0中那些语法糖都干了些什么(终结篇)
终于写到终结篇了,整个人像在梦游一样,说完这一篇我得继续写我的js系列啦. 一:带索引的对象初始化器 还是按照江湖老规矩,先扒开看看到底是个什么玩意. 1 static void Main(strin ...