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

Project1

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

[原创发布] 启动时获取句柄 | 修改分辨率 | 窗口外观 | 加载字体

[复制链接]

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
跳转到指定楼层
1
发表于 2010-9-27 05:25:49 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 紫苏 于 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, 下载次数: 13723)

评分

参与人数 2星屑 +820 收起 理由
eve592370698 + 120 毫不犹豫,要是能帮我解决卡屏问题更好了。.
后知后觉 + 700 紫苏大人你太强大了.鼓励III

查看全部评分

Lv1.梦旅人

梦石
0
星屑
340
在线时间
5 小时
注册时间
2014-1-7
帖子
2
25
发表于 2014-1-8 03:49:02 | 只看该作者
虽然看的一头雾水,但还是给跪了,佩服!希望能顺利解决窗口和全屏不同步的问题。
回复 支持 反对

使用道具 举报

Lv1.梦旅人

XYGG

梦石
0
星屑
62
在线时间
115 小时
注册时间
2009-1-20
帖子
340
24
发表于 2012-1-27 13:21:35 | 只看该作者
我找了这个N天了,一直在论坛搜索“字体”……今天终于找到了。

评分

参与人数 1星屑 -100 收起 理由
忧雪の伤 -100 别屡教不改。

查看全部评分

路过……酱油……别烦我……
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
432
在线时间
4175 小时
注册时间
2010-6-26
帖子
6474
23
发表于 2011-4-24 14:10: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显存,玩火炬之光都不卡,使用了您的分辨率扩展脚本偏偏卡屏,您不觉得缺少东西了吗?
潜水,专心忙活三次元工作了……
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
2 小时
注册时间
2011-4-16
帖子
15
受到警告 22
发表于 2011-4-20 18:53:46 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

精灵族の天使

梦石
0
星屑
1697
在线时间
3038 小时
注册时间
2007-3-16
帖子
33731

开拓者贵宾

21
发表于 2010-12-8 20:27:27 | 只看该作者
精灵毫无目的的飞过……
话说回来,如果这样的话就只能用ver1.03的dll和其他的东西了么……
(话说回来,虽然那个获取窗口的版本很低,但是不需要任何WG效果不错的,而且VX适用)

点评

我看过八云的句柄脚本发布帖了……好像也是外带引用的DLL不能随便乱改=W=  发表于 2010-12-8 21:23
这个是可移植的,但我只提供了 1.03 的预编译二进制文件,1.02 只能自己编译了。之前那个句柄脚本仍然有潜在问题,见八云最早的句柄脚本发布帖。  发表于 2010-12-8 20:54
回复 支持 反对

使用道具 举报

Lv1.梦旅人

看不到我

梦石
0
星屑
50
在线时间
229 小时
注册时间
2005-11-6
帖子
1741

贵宾

20
发表于 2010-12-8 20:16:33 | 只看该作者
好像放不了BGM了……

点评

全局搜索 Audio.bgm_play,把注释取消即可。我这边对 RM 的 MIDI 播放库的兼容有问题,要等待 10 秒才能开始播放 MIDI  发表于 2010-12-8 20:55
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
89
在线时间
308 小时
注册时间
2010-8-10
帖子
794
19
发表于 2010-11-26 18:08:12 | 只看该作者
回复 紫苏 的帖子

如何修改RM1.04
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
7946
在线时间
1182 小时
注册时间
2007-7-29
帖子
2055
18
发表于 2010-11-8 19:12:12 | 只看该作者
原来字体问题可以这样解决……之前搞了好久……收下研究……感激不尽<(_ _)>
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
12 小时
注册时间
2009-9-13
帖子
18
17
发表于 2010-11-7 17:26:20 | 只看该作者
  额  来看看是神马东西
吾乃剑仙剑断九天
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-4 16:40

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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