Project1

标题: 启动时获取句柄 | 修改分辨率 | 窗口外观 | 加载字体 [打印本页]

作者: 紫苏    时间: 2010-9-27 05:25
标题: 启动时获取句柄 | 修改分辨率 | 窗口外观 | 加载字体
本帖最后由 紫苏 于 2010-9-27 13:01 编辑

灵感来自最近偶然看到的夏娜的 RGSS102J.dll 补丁:
http://rpg.blue/forum.php?mod=viewthread&tid=127979
http://rpg.blue/thread-118633-1-1.html
这个工程实现了在启动时准确获取句柄、修改游戏窗口分辨率、窗口外观以及加载字体的功能,通过代理 DLL 劫持了 kernel32 和 user32 这两个系统 DLL,而其中最重要的是在 kernel32 里的 LoadLibrary 或 GetProcAddress上安装钩子,因为 RM 通过这两个函数获得的地址调用了大量函数,而这些函数并不在对象文件的导入表中

1、获取句柄
hook user32 的 CreateWindowEx,返回的时候保存一个全局的句柄变量,然后再提供给 Ruby 一个接口获取这个变量。于是这个脚本可以退休了:
http://rpg.blue/forum.php?mod=viewthread&tid=133018
实际上这个脚本也确实有潜在的问题,GetWindow 在极端场合下会引起无限循环,和这个直接劫持 API 的质量没法比

2、修改分辨率
这个和目前的分辨率脚本相比之下,优势在于启动时就修改,而不是等到 RGSS 开始执行脚本时才修改。RM 的 Game.exe 创建窗口的过程是:
设计窗口类 WNDCLASS;
RegisterWindow 注册窗口类;
CreateWindowEx 创建窗口;
通过 SetRect 把一个 RECT 矩形结构体初始化为 (0, 0, 640, 480);
通过以上矩形,AdjustWindowRect 计算出 640*480 的客户区需要多大的窗口尺寸;
GetSystemMetric 获取系统屏幕等信息,计算窗口居中的坐标;
SetWindowPos 移动窗口,并调整尺寸

到这里 Game.exe 就完事儿了,但如果你只 hook 了这些函数中的一个来改分辨率,结果是一会儿又被改回了 640*480。这是因为 rgss10*j.dll 里还有龌龊的勾当,它会第二次调用 SetWindowPos 移动窗口并修改尺寸,但这一点从它的导入表里看不出来,因为它是通过 GetProcAddress 获取的函数地址来调用 API 的。于是首先要 hook Kernel 的 GetProcAddress,劫持 SetWindowPos,然后把调用转移到 user32 的代理 DLL 中。两边都劫持后,启动时修改分辨率就实现了

3、修改窗口外观
仍然是 Hook CreateWindowEx,把传递进来的 dwStyle 参数和 dwExStyle 胡改一气即可。范例工程里改了几个,但并没有全部囊括,有心人可以自行添加

4、加载字体
Kernel32 必然是首先映射到进程地址空间的 DLL,所以在 kernel32 的代理 DLL 的入口函数里调用 AddFontResourceEx 即可

以上功能中需要配置参数都可以在 Game.ini 中调整,内含详细注释。kernel32 的 代理 DLL 是 kernel33,user32 自然就是 user33。源代码在工程的 src 目录下,比较长。就不发到帖子里了,可以自行 build

范例使用的是 RGSS103J.DLL,如果你希望使用 1.02 的 DLL,那可以用十六进制编辑器把 rgss102j.dll 里的 kernel32.dll 改为 kernel33.dll(Game.exe 也是相同的改法,同时还可以改 user32 为 user33)。否则可以直接拷贝 Game.exe、Game.ini、user33.dll、kernel33.dll 到你的工程,覆盖原文件。如果你不需要范例中的字体,那可以修改 Game.ini 中的字体设置为空

这四个功能都是以前有过脚本,但多少都有点问题的,所以先行实现,但通过 DLL 劫持,可能性还有很多。proc.txt 里包含了 RMXP 通过 GetProcAddress 调用的函数(仅含“第一层”,不包含 LoadLibrary 获取真实 user32 的 GetProcAddress 地址然后又通过它调用的“第二层”函数)

欢迎提出建议,以及可能、希望实现的功能
Project4.rar (4.01 MB, 下载次数: 13724)
作者: 禾西    时间: 2010-9-27 11:13
把腳本已備份這東西也kill掉他吧!
作者: 红灯    时间: 2010-9-27 11:43
本帖最后由 红灯 于 2010-9-27 11:48 编辑

盼着出VX的dll补丁!
作者: goahead    时间: 2010-9-28 10:40
提示: 作者被禁止或删除 内容自动屏蔽
作者: 后知后觉    时间: 2010-9-28 14:48
欢迎提出建议,以及可能、希望实现的功能


更改分辨率后(比如800X600).全屏的分辨率也是 800X600.

我把ini塞进exe里去了.
但是 分辨率和字体 无效.
需要在exe旁边再放个Game.ini单独把分辨率和字体写进去才行.
把设置分辨率露在外面感觉怪怪的.字体的话就无所谓了...
作者: summer92    时间: 2010-10-1 11:56
这是高科技
作者: 菜鸟飞呀飞    时间: 2010-10-1 13:17
提示: 作者被禁止或删除 内容自动屏蔽
作者: 退屈£无聊    时间: 2010-10-2 21:47
跑来支持一下,DLL甚么的对我来说还是天方夜谈哦。
作者: 逸豫    时间: 2010-10-2 22:50
这是因为 rgss10*j.dll 里还有龌龊的勾当

看到龌龊的勾当我喷了- -|||
作者: orochi2k    时间: 2010-10-3 01:45
龌龊的东西是美的
作者: 亿万星辰    时间: 2010-10-3 08:26
来吧,VX版的也快些出现吧~
现在写代码就得靠你们这些高端的插件了!
作者: IamI    时间: 2010-10-7 15:33
本帖最后由 IamI 于 2010-10-7 15:46 编辑

甚久未来……进来就看见一神物,收走= =b
从此Graphics不再抽风……了么= =b
以下为诡异测试脚本一枚,假设高度超过480
  1. bitmap = Bitmap.new(480,100)
  2. bitmap.fill_rect(0,0,480,100,Color.new(255,0,0))
  3. sprite = Sprite.new
  4. sprite.bitmap = bitmap
  5. sprite.y = 480

  6. loop do
  7.   Graphics.update
  8.   Input.update
  9.   if Input.trigger?(Input::C)
  10.     Graphics.freeze
  11.     bitmap.fill_rect(0,0,480,100,Color.new(rand(255),rand(255),rand(255)))
  12.     Graphics.transition(8)
  13.   end
  14. end
复制代码

作者: lokylogyrpg    时间: 2010-10-16 17:41
弱弱地问下~~~为什么我设置1024*768后全屏,又回到了640*480。。。?
作者: 842130101    时间: 2010-10-16 21:50
噢,我晕..了。。
作者: 灼眼的夏娜    时间: 2010-10-21 12:40
一一 推荐自写rgss player 安装hook~~  方便许多(笑

捏苏酱~
作者: c00l    时间: 2010-11-7 10:30
我是菜鸟 问一下 这样分辨率是提高了 但是窗口内新增的分辨率是黑滴 怎么搞?
作者: c534036840    时间: 2010-11-7 17:26
  额  来看看是神马东西
作者: enghao_lim    时间: 2010-11-8 19:12
原来字体问题可以这样解决……之前搞了好久……收下研究……感激不尽<(_ _)>
作者: 不是马甲    时间: 2010-11-26 18:08
回复 紫苏 的帖子

如何修改RM1.04
作者: 小湖    时间: 2010-12-8 20:16
好像放不了BGM了……
作者: 精灵使者    时间: 2010-12-8 20:27
精灵毫无目的的飞过……
话说回来,如果这样的话就只能用ver1.03的dll和其他的东西了么……
(话说回来,虽然那个获取窗口的版本很低,但是不需要任何WG效果不错的,而且VX适用)
作者: 仙三    时间: 2011-4-20 18:53
提示: 作者被禁止或删除 内容自动屏蔽
作者: eve592370698    时间: 2011-4-24 14:10
标题: 说真的,很让我失望
本帖最后由 eve592370698 于 2011-4-24 18:50 编辑

您顺便帮我弄弄不是马甲的那个分辨率扩展脚本吧,漏洞太多了,真的,例如地图与事件、菜单的优先级分层就是个问题。现在的优先级成了:最顶层是脚本人物跟随的同伴,然后是有优先级的图块,下面成了ZTBS系统菜单,这一下子反了。
http://rpg.blue/thread-162509-1-1.html
您的扩展存在着致命的缺陷,就是您并没有相应地提高游戏所需要占用的系统资源,包括硬资源像CPU、内存、GPU、显存等,特别是使用了不是马甲的分辨率扩展脚本之后,原本一个地图达到100个事件都不卡,这下可好,超过30个事件就可能卡,要想不卡,最多别超过50个事件。但是讽刺的是:CPU和内存占用率并没有根据运转的需要的提升。您想想,我家和同学家电脑2G内存,酷睿双核CPU,1G显存,玩火炬之光都不卡,使用了您的分辨率扩展脚本偏偏卡屏,您不觉得缺少东西了吗?
作者: 774559263    时间: 2012-1-27 13:21
我找了这个N天了,一直在论坛搜索“字体”……今天终于找到了。
作者: 可乐小龙    时间: 2014-1-8 03:49
虽然看的一头雾水,但还是给跪了,佩服!希望能顺利解决窗口和全屏不同步的问题。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1