设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 10803|回复: 18
打印 上一主题 下一主题

[RMVX发布] 发呆一天的产物--获取窗口句柄完美版

[复制链接]

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
1
发表于 2010-11-11 11:13:16 | 显示全部楼层
不公开源码么 =(
既然必须用到 DLL,猜测是改用了 EnumWindows,继而需要回调函数?
其实自写 RGSS Player (夏娜写过)是最好的解法,也可以劫持 CreateWindowEx (紫苏似乎弄过一个劫持 user32.dll 的工程)。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
2
发表于 2010-11-11 11:47:07 | 显示全部楼层
本帖最后由 苏小脉 于 2010-11-11 11:50 编辑

其实比较线程标识就可以了,另外 if 内部的 return 1 有点多余。 ^_^

目前这样比较会在某些场合下出现问题,比如:用户通过脚本创建了另一个顶层窗口(自然其创建进程和创建线程都和主窗口一致),这时可能拿到的并不是原来的主窗口句柄。紫苏那贴里的脚本实际上也没有完美地考虑到所有场合——窗口类,顾名思义,就是一类窗口的抽象描述,自然可以有多个窗口实例属于同一个窗口类,而这时如果恰好存在两个同属于 RGSS Player 类,由相同的进程/线程创建的顶层窗口,那获取到的句柄也有可能不是原来的主窗口句柄。
像夏娜那样自行编写一个容器应用程序就很简单地解决了这个问题,毕竟 CreateWindowEx 是在自己的有源码的程序中调用的,其返回值就是窗口句柄。

Ruby 想要通过函数地址来调用本地函数的话,至少需要支持调用函数相关的一些指令(包括转移寄存器值和偏移 PC 等),而为了提供这样的接口,本地 DLL 通常是难免的。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
3
发表于 2010-11-11 12:07:34 | 显示全部楼层
本帖最后由 苏小脉 于 2010-11-11 12:07 编辑

回复 铃仙·优昙华院·因幡 的帖子

CreateWindowEx 是在 Game.exe 这个外壳里被调用的,这个可以通过观察其导入表发现;RGSS***.DLL 主要负责引擎的核心逻辑,这使得 DLL 不受具体窗口的羁绊,也可以算是一种简陋的设计模式吧。
另:你说的调用回调函数(本地?)的方法能否共享一下?
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
4
发表于 2010-11-11 12:23:42 | 显示全部楼层
哦,是用了标准库的 DL。不过 1.9.2 官方的 DL 并没有 callback 这个单例方法,作者应该是进行了扩展的,在 C 层直接调用 callback 的块。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
5
发表于 2010-11-14 09:58:18 | 显示全部楼层
本帖最后由 苏小脉 于 2010-11-14 09:59 编辑

赞一个,直接反汇编果然高明!

另:经过调查发现 DB.callback 出现在了 Rails 的官方文档中,但 CRuby 中默认确实没有,可能和具体的 Ruby 实现有关。win32/api 那个是第三方库。
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-5-6 15:19

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表