本帖最后由 KB.Driver 于 2020-8-24 20:57 编辑
rgss自动加载了win32api,不考虑外置库的话,可以直接用这个。
常量 = Win32API.new(DLL名, 函数名, 参数数组, 返回值)
1、首先,你需要从dll里加载函数。
虽然我们也可以用外置的dll,但最常用的还是user32.dll
2、需要函数名,这个一般就需要查手册了,手册可以看这个、
http://www.yfvb.com/help/win32sdk/webhelpleft.htm
这个的好处是中文的,缺点就是不够新不够全。如果有版本要求请找英文的文档。
进去以后点“API参考”-“函数”然后找你需要的函数。
打个比方,在这里找到这样一个函数:
它的功能是返回当前正在被使用的窗口的句柄(hwnd)
句柄是一个long整数,用来唯一标识窗口
接下来我们怎么调用它?
3、参数数组
这个函数比较简单,从手册得知它的参数是void(无)
表示参数的类型时, L代表Long P代表Pointer I代表Int V代表Void (在实际使用的时候HResult和各种Handle都是Long,字符串是P)
那么我们就写'V',这里大写小写其实都没有关系
只有一个参数时一般用字符串就行,但是有多个参数时要用字符串数组比如["L", "P"]或者%W{ L P }
4、返回值
从手册已经得知返回的句柄是long,那么我们写'L'
5、测试
根据上面的分析,要载入这个函数,我们就这样写
GetForegroundWindow = Win32API.new("user32.dll", "GetForegroundWindow", "V", "L")
GetForegroundWindow = Win32API.new("user32.dll", "GetForegroundWindow", "V", "L")
之后要调用函数时,我们使用
函数名.call(参数)
这里我们可以用hwnd = GetForegroundWindow.call,因为不需要参数所以不用写括号,但要记得把返回值赋值给变量。
6、动手
那么获得了窗口的句柄有什么用呢?
我们可以修改窗口的标题,修改窗口的位置与显示状态(最大、最小化……)
下面就试着修改标题吧。
我们先找到文档:
接着载入函数:
SetWindowText = Win32API.new("user32.dll", "SetWindowText", %W{ L P }, "I")
SetWindowText = Win32API.new("user32.dll", "SetWindowText", %W{ L P }, "I")
还记得吗?字符串体现为P,因为字符串是字符指针。而BOOL体现为I,因为C语言的逻辑变量是用1和0表示的。
下面就来试着修改游戏的标题吧:
GetForegroundWindow = Win32API.new("user32.dll", "GetForegroundWindow", "V", "L") SetWindowText = Win32API.new("user32.dll", "SetWindowText", %W{ L P }, "I") $hwnd = GetForegroundWindow.call class << Graphics alias cld99_update_win32api update def update @count ||= 0 @count += 1 SetWindowText.call($hwnd, "Time:"+ Time.now.to_s) if @count > 10000 SceneManager.exit end end end
GetForegroundWindow = Win32API.new("user32.dll", "GetForegroundWindow", "V", "L")
SetWindowText = Win32API.new("user32.dll", "SetWindowText", %W{ L P }, "I")
$hwnd = GetForegroundWindow.call
class << Graphics
alias cld99_update_win32api update
def update
@count ||= 0
@count += 1
SetWindowText.call($hwnd, "Time:"+ Time.now.to_s)
if @count > 10000
SceneManager.exit
end
end
end
好像写的比较糟糕,因为我发现Graphics自身的update会重新把标题修改回去……晕
总之基础的是这些,还有调数据的会用到Cstruct,需要String#pack和Array.unpack,如果用到再学也可以。
这些都是网上有资料的,查ruby调win32api就有了。
|