如何通过已知句柄,取得VB中正在运行的窗体的实体对象

nmd002 2008-05-27 04:23:02
谁能用VB代码实现以下内容:
把正在VB中运行的其他程序(外部程序)的某窗体,通过取到的句柄,取得这个窗体的实例化对象,并对其进行对象操作(主要是取得控件容器对象)。对象可以转化成VB.FORM类型的,或者是VBIDE.VBFORM类型的都行。

即set form1 = <根据已取得句柄的窗体转化成的实例对象>。然后使用form1.属性(或方法)进行各种操作。
...全文
1060 点赞 收藏 28
写回复
28 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wujianghua830726 2011-12-07
呵呵,我ue学习下
回复
zack_0_ren 2011-11-23
遇到了类似的问题:已经获取了其他程序某窗口的句柄,想要把它截图保存,但图片长宽不一定.想法是根据该窗口句柄获取其对象,再获取长宽属性.看帖子估计获取对象是不行了.目前也就是预设长宽值这个笨办法了.
回复
tanzhiyong2010 2011-05-12
findcontrol
回复
nmd002 2008-06-18
如果还是没有新的途径,恐怕我只能结帖了.
我觉得现在无法完成这个开发,打算放弃了.

综合大家的意见,如果想要实现我的想法,只能人工制作一个转换用的FORM类,其结构必须跟VB6中已定义的类完全一致,达到细微处分毫不差的程度才行.然后才能按照9楼"严重睡眠不足啊^_^"所给出的例子,获得对一个窗体实例对象的控制.理论上再利用SetClassLong函数,应该就可以达到转化为真正VB6的FORM窗体实例对象的效果了.但是在参数及实现上,还是有很多未知环节.本人也只能奋斗到此,无法再进一步了.

而其中最重要的一环,是要求人工制作的这个FORM类,要使用C中的规定类和对象,其中还要包括VB6的其他类对象,以用于转换后在VB6中的更加方便的被调用.基本上不是写VB6的那帮人,干不了这个工作.--因为只有他们才知道如何用C写VB6的窗体类定义.

现将已知内容总结于此,希望将来能有高人,再研究同一实现时,可以借助我的研究和各位高人的意见,向这个问题再做挑战,并彻底解决它.
我很不甘心.我希望那些没有去过微软的中国程序员,有一天可以在同样不了解VB6内部资料和规定的情况下,只凭我们自己手上的各种工具和聪明才智,弄懂微软的产品结构,并把这个东西做出来.相信那时候中国程序员的软件水平就不只翻一番了.
回复
nmd002 2008-06-04
谢谢"严重睡眠不足啊^_^"的指导,SetClassLong这个函数我还真没仔细看过它的用法和用途,有空真应该好好研究一下相关的知道.
回复
Sandrer 2008-06-04
用SetClassLong函数可以对某个类进行子类化
至于你问的,如何获得窗体中包含的其它控件,可以用EnumChildWindow函数
但是属性嘛....有点难搞~~~~~~~~~

算了,我还是继续呆着学习吧,看来我的方法并不能满足到你.....
回复
lsftest 2008-06-02
[Quote=引用 19 楼 Sandrer 的回复:]
其实你的主要目的,是想控制其它窗体中用VB编写的窗口类?
如果是这样的话,用全局子类化,更改一下VB窗口类的消息处理函数
在消息处理过程中,判断hWnd是属于哪个窗体,再进行写代码~
[/Quote]
楼主在上一个帖子里要求的不仅仅是各控件的各种属性值,还有程序中使用的全部变量值都想得到..
之前那个帖子我还以为楼主是在调试别人的源代码,但看现在这帖子的意思,基本上跟crack别人的exe没什么区别了..
看来楼主想要的,是类似于softice/trw/od那一类的debuger..
偏偏vb在底层方面真是太弱了...还是想想有没有其它方法吧...
吾...我记得以前有个软件能静态逆向vb的exe,把一些控件属性什么的列出来..楼主不如去找找那些工具吧..

回复
Sandrer 2008-06-02
其实你的主要目的,是想控制其它窗体中用VB编写的窗口类?
如果是这样的话,用全局子类化,更改一下VB窗口类的消息处理函数
在消息处理过程中,判断hWnd是属于哪个窗体,再进行写代码~
回复
nmd002 2008-06-02
回复17楼嗷嗷叫的老马:http://www.m5home.com/blog2/blogview.asp?logID=197&cateID=2里面写的内容我拜读过了.确实很长见识,但是我可能用不上.

原因解释如下:首先,看VC代码像是使用过MFC的架构,并不是你的VC学得不好,而是因为VC的内容你并未接触过MFC编程的部分,所以你要是尝试用纯粹的基础窗口编程来实现MFC的内容,几乎是不可能的.因为MFC内定了相当多的内部对象,不经常使用或者全面阅读过MFC的相关帮助,是很难理解其意义及用法的.
其次,如果我不能了解IHTMLDocument接口的定义(详细到内部变量类型及其所占字节的长度),就不能在VB6中使用该对象.还有其相关的其他辅助类型也是必须全都了解才行,因为MFC大部分的类都是相互关联和相互支持的.如果就是要用此类方法开发,只怕我要用VB6自己先定义一个MFC的类库(接口,结构,类).
再次,IHTMLDocument接口好歹还是有据可查的定义过的接口,尚且有出处.而VB6中的窗体只怕没那么好解决,至少我在MSDN里没办法查到.只有运行和非运行时类名的解释,但是用于开发的类定义的详细内容就没有了.

眼下看,我好像除了直接从内存里取值,再想办法把内存里的值转换成可用的数据这种方法,基本上很难实现取值的愿望了.但是,要这么做,必须了解VB运作的机制,了解整个数据向本地窗口取值操作的全部详细过程.除非对VB6的各个环节都了如指掌,不可能达到这种程度.我看想实现我的愿望,除非微软开发VB6本地窗体的人来帮忙了.要是再没有新的建议,我只能再次结帖了.
回复
lsftest 2008-06-02
你用反编译vb,逆向vb之类的关键字搜索一下吧,,,
回复
nmd002 2008-06-02
回复19楼"严重睡眠不足啊^_^":
请教一下,"用全局子类化"是指什么样的实现方法?
另外,"更改一下VB窗口类的消息处理函数.在消息处理过程中,判断hWnd是属于哪个窗体,再进行写代码~",这样做好像只能监听到指定窗体的各消息,并不能使我有效地取得其对象实体.而HWND这个问题早就解决了,是一开始就可以取得到的.问题只在于知道句柄之后,我应该怎么做才能控制窗体,或者取得其全部可用属性及内含控件.

回复20楼(lsftest):
先不考虑程序中使用的全部变量,只要能把窗体的各属性和内含的各控件取到手,我就很满足了.其他的可以在实现了这一前提的基础上再研究.如果窗体对象可得到,那么再想取得其内含的其他变量应该不会太难.
还想请教,"我记得以前有个软件能静态逆向vb的exe,把一些控件属性什么的列出来..",这个软件还记得叫什么名字吗?记不清楚也不要紧,记得多少告诉我多少,我好去查一下.
如果真的能找到,我还真应该试试,说不定可以找到一些相关的代码,这样也许我的问题还能解决.
回复
有些糊涂.

现在还没有想明白.

IE里面,可以实现根据句柄获取对象~~

看这个显示网页密码的代码:

http://www.m5home.com/blog2/blogview.asp?logID=197&cateID=2

这个代码就是根据句柄,取到了一个访问这个对象的接口,而对象本身其实还是在IE里面.

但是,估计这是IE本身的功能之一,它提供了接口.

而你想完成的功能,是要访问并不支持这种方法的东东....

不知道有没有办法"加工"出一个接口来..

就像电路一样~~
回复
lsftest 2008-05-30
这个可能性真的不大。。。
楼主想想,如果真有这技术,那么那帮cracker还需要那么大费周章的去反汇编吗?
回复
我认为不可能,对于部分东西应该可以,但是对其他的东西那就难说了。
回复
nmd002 2008-05-29
我搞得这么麻烦,最终目的也只是为了取得像VB6“本地窗体”中的那些数据。如果自已进行封装类的话,只怕很难将本地窗体中的各数据取得出来了。
回复
nmd002 2008-05-29
那请问我该怎么才能取到别的进程的数据呢?尤其是在某个窗体中的数据(不只是控件的显示文字,还有VB控件的其他属性)。就像VB6“本地窗口”里显示的各控件的各属性。
回复
chenhui530 2008-05-29
你要获取别的进程的数据是可以要拿别的进程的对象在本进程中使用几乎是不可能
回复
CathySun118 2008-05-28
这个有什么意义阿?
回复
lyserver 2008-05-28
虽然直接使用消息API很容易实现跨进程窗体的消息传递和外观控制,还可以把相关代码封装到自己的类里,但实现不了LZ所说的SET FORM1=XX之类的语句,因为VB不支持接口继承(IMPLEMENT其实没有多大用处),不可能用VB实现VB.FORM的COM子类。建议LZ转变思路,用一个普通的类进行封装,然后使用类变量进行操作就行了。
回复
nmd002 2008-05-28
看了9楼"严重睡眠不足啊^_^"的回复,终于明白您在1楼里提到的那段话是什么意思了.原来您是想采用自封装具备基础属性的FORM类,然后通过子类型化的方法,使对象转化为更加具体的操作对象.
但是这样有一个环节有问题.就算构建了一个非常严谨的VB下的CWND类,也不能使用MFC里那个通过句柄取到VC窗体对象的方法.所以还是不具备任何实用意义.也就是说如果您没有办法像引用API一样,把MFC里通过句柄取窗体的那个函数声明到VB里,一切都是徙劳的.

而我主要想做的是取得窗体后,再通过这个对象取得其全部容器中的控件集合,然后再取其属性.这样一封装之后,取到的窗体对象只怕要想成功地子类型化成VB可用的窗体也是不可能,自定义的CWND和VB.FORM之间根本没有继承关系,执行成功的可能性将非常之低.请问"严重睡眠不足啊^_^",您用所帖出的代码,成功地转化过本地工程中的窗体对象吗?

个人认为这是思路很清晰的代码,我只是想关注一下上面这段代码是否经过实际运行检验过.
回复
发帖
API
创建于2007-09-28

1461

社区成员

VB API
申请成为版主
帖子事件
创建了帖子
2008-05-27 04:23
社区公告
暂无公告