让我们继续了解RMER如何利用DLL来增强RM,完成RM无法单独完成的任务!
教程第二弹:Windows系统API调用示例
这一次我将示范如何使用API,内容就是将我们RM制作的游戏固顶,就如同有些播放器的“总是在最前面”的功能类似,不过可能没有什么实用价值就是。
需要使用到的API有: SetWindowPos
Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long 说明 这个函数能为窗口指定一个新位置和状态。它也可改变窗口在内部窗口列表中的位置。该函数与DeferWindowPos函数相似,只是它的作用是立即表现出来的(在vb里使用:针对vb窗体,如它们在win32下屏蔽或最小化,则需重设最顶部状态。如有必要,请用一个子类处理模块来重设最顶部状态 GetActiveWindow Declare Function GetActiveWindow Lib "user32" Alias "GetActiveWindow" () As Long 说明 获得活动窗口的句柄 返回值 Long,活动窗口的句柄,如没有窗口处于活动状态,则返回零值 详细的说明可以从附送的API文档(VB版,将近770多个Windows系统API函数)中寻找。 API文档下载(希望有人帮忙发布下这个文档算了): http://bbs.66rpg.com/UP_PIC/200703/api32.rar 新建工程,Main脚本块代码如下:
#========================================================= # ■ Main #------------------------------------------------------------------------------ # 各定义结束后、从这里开始实际处理。 #=========================================================
begin # 准备过渡 # 设置系统默认字体 Font.default_name = (["黑体"]) # 没有任何说明,参见教程吧…… dll1 = Win32API.new('user32', 'SetWindowPos', 'lllllll', 'l') dll2 = Win32API.new('user32', 'GetActiveWindow', nil, 'l') $me_hwnd=dll2.call dll1.call($me_hwnd, -1, 0, 0, 0, 0, 0x2 + 0x1 + 0x40) Graphics.freeze # 生成场景对像 (标题画面) $scene = Scene_Title.new # $scene 为有效的情况下调用 main 过程 while $scene != nil $scene.main end # 淡入淡出 Graphics.transition(20) rescue Errno::ENOENT # 补充 Errno::ENOENT 以外错误 # 无法打开文件的情况下、显示信息后结束 filename = $!.message.sub("No such file or directory - ", "") print("找不到文件 #{filename}。 ") end 示例工程: http://bbs.66rpg.com/UP_PIC/200703/API使用.rar 这里的两句: dll1 = Win32API.new('user32', 'SetWindowPos', 'lllllll', 'l') dll2 = Win32API.new('user32', 'GetActiveWindow', nil, 'l') 创建了两个API函数对象,参数列表如上文所描述。 然后: $me_hwnd=dll2.call 获得了我们游戏窗口的“句柄”,这个“句柄”不理解美关系,大概可以理解就是Windows系统给每个窗口分配的一个ID性质的东西。只有利用这个句柄我们可以对句柄指向的窗口进行各种操作。 最后: dll1.call($me_hwnd, -1, 0, 0, 0, 0, 0x2 + 0x1 + 0x40) 这句实现了将窗口置顶的功能,第一个参数就是现在窗口的句柄啦,第二个参数-1就是常量HWND_TOPMOST(将窗口置于列表顶部,并位于任何最顶部窗口的前面 ),后面四个0表示保持窗口位置和大小不变,随后最后一个参数是设定窗口类型的没有什么要修改的。实际上这个语句甚至可以设定窗口的位置和大小哦,这些大家可以自己根据所给的API文档对照查看尝试。 通过简单的调用,大家应该基本懂得如何调用DLL了吧,在不断的尝试中相信可以做的更好的。 需要什么功能的话完全可以自己改改弄出来啦,不行的话可以去搜索各大编程网站搜搜啦,偶们都有BAIDU和GOOGLE的嘛。 更好的大家可以下载一些美兽的好东西回去研究啦,很多都是API的,比如最近的“奇形怪状的窗体”(说实话,真的很恶搞……),很多网站都介绍过的API调用。
下期预告:利用VC制作自己的DLL,更加灵活快速多功能的RM即将诞生! (希望“美兽”可以给予一定支持啦,公布一些简单的DLL?我不知道该写些什么东西哈……呵呵……) |