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

Project1

 找回密码
 注册会员
搜索
Project1 查看内容

利用DLL完成RM不可能任务!(2)API示例:窗口置顶

2007-4-22 00:00| 发布者: 叶舞枫| 查看: 2953| 评论: 0|原作者: gpra8764

摘要:     作者 gpra8764 版本 没有 相关网址 点此进入讨论贴 范例工程 没有范例   教程内容 让我们继续了解RMER如何利用DLL来增强RM,完成RM无法单独完成的任务!教程第二弹:
 
 

作者

gpra8764

版本

没有

相关网址

点此进入讨论贴

范例工程

没有范例


 

教程内容

让我们继续了解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?我不知道该写些什么东西哈……呵呵……)
 
 

教程的通用说明

本站发布的教程,大多经过一些测试,应该都能够实现相应功能。但不保证所有的教程都是最优化的制作方法。

相关问题,点击发布贴进行讨论。谢谢您的鼓励与支持。


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

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

GMT+8, 2024-3-28 23:52

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

返回顶部