Project1

标题: 请问如何获取Windows用户的用户名 [打印本页]

作者: 雨落忧伤    时间: 2017-12-10 09:11
标题: 请问如何获取Windows用户的用户名
记得之前在一个RM2003制作的游戏之中,有一个名叫《One Shot》的游戏,那个游戏是一个含有meta元素的游戏,游戏中的主人公会叫出电脑前的玩家的名字,也就是玩家电脑的用户名。
我觉得既然RM2003都可以实现,那么RMVA应该也没有问题,求教如何才能获取游戏玩家的电脑的用户名?
因为不同的系统方法可能不一样,我只想知道Windows用户如何获得就好了,自己也想做一款含有meta元素的游戏。

作者: SailCat    时间: 2017-12-10 10:10
RUBY 代码复制
  1. GetUserName = Win32API.new("advapi32", "GetUserName", "pp", "i")
  2. user = "\0" * 255
  3. GetUserName.call(user, "\xff")
  4. user = user.strip


作者: 雨落忧伤    时间: 2017-12-10 10:44
SailCat 发表于 2017-12-10 10:10
GetUserName = Win32API.new("advapi32", "GetUserName", "pp", "i")
user = "\0" * 255
GetUserName.call( ...

多谢。
请问需要什么dll插件吗?
对脚本只懂得很少一点,请问这段脚本应该放到哪里去使用?
作者: fux2    时间: 2017-12-10 13:39
雨落忧伤 发表于 2017-12-10 10:44
多谢。
请问需要什么dll插件吗?
对脚本只懂得很少一点,请问这段脚本应该放到哪里去使用? ...

这样吧。你先按F11插入一个脚本页,最上面就行
  1. GetUserName = Win32API.new("advapi32", "GetUserName", "pp", "i")
  2. user = "\0" * 255
  3. GetUserName.call(user, "\xff")
  4. $username = user.strip
复制代码


然后在事件里设置变量 = 脚本:$username
作者: 雨落忧伤    时间: 2017-12-10 14:23
fux2 发表于 2017-12-10 13:39
这样吧。你先按F11插入一个脚本页,最上面就行

有一个问题,就是每次显示这个变量的时候都会报错。错误内容是:
ErrorMessage: invalid byte sequence in UTF-8
是不是如果用户名是汉字的话,这个就没有办法实现功能?

作者: hyrious    时间: 2017-12-10 17:25
  1. ENV['UserName']
复制代码

作者: 雨落忧伤    时间: 2017-12-10 17:53
hyrious 发表于 2017-12-10 17:25

这段要放在什么地方使用?
作者: hyrious    时间: 2017-12-10 18:08
雨落忧伤 发表于 2017-12-10 17:53
这段要放在什么地方使用?

任何可以插脚本的地方
比如你要把它放进变量的话
脚本: $game_variables[1] = ENV['UserName']
显示文章: "\V[1], 我说的就是你"
作者: 雨落忧伤    时间: 2017-12-10 18:18
hyrious 发表于 2017-12-10 18:08
任何可以插脚本的地方
比如你要把它放进变量的话
脚本: $game_variables[1] = ENV['UserName']

多谢提醒,已经尝试了。
确实不会报错了,但是有了一个新的问题,那就是显示出来的是一些无法识别的字符(类似于????)
不过这也许是advapi32自己的问题了(就是字库缺失相应文字),不知道能不能解决……
不能解决就先这样了,总之非常感谢。
作者: fux2    时间: 2017-12-10 19:16
雨落忧伤 发表于 2017-12-10 18:18
多谢提醒,已经尝试了。
确实不会报错了,但是有了一个新的问题,那就是显示出来的是一些无法识别的字符 ...

有了楼上的这段不需要之前的代码了。



作者: 雨落忧伤    时间: 2017-12-10 19:38
fux2 发表于 2017-12-10 19:16
有了楼上的这段不需要之前的代码了。

嗯,的确是可以……但是问题和刚才那位的是一样的……
就是最后无法显示……不过这个也许是无法解决的吧……

QQ图片20171210193743.png (22.38 KB, 下载次数: 30)

QQ图片20171210193743.png

作者: fux2    时间: 2017-12-10 23:06
雨落忧伤 发表于 2017-12-10 19:38
嗯,的确是可以……但是问题和刚才那位的是一样的……
就是最后无法显示……不过这个也许是无法解决的吧 ...

在你的脚本最上面插入一页新页,粘贴以下内容,
然后变量设置的地方改成
ENV['UserName'].s2u


  1. class String

  2.   @@MultiByteToWideChar  = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  3.   @@WideCharToMultiByte  = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')

  4.   def u2w
  5.     i = @@MultiByteToWideChar.call(65001, 0 , self, -1, nil,0)
  6.     buffer = "\0" * (i*2)
  7.     @@MultiByteToWideChar.call(65001, 0 , self, -1, buffer, i)
  8.     buffer.chop!
  9.     return buffer
  10.   end  

  11.   def u2s
  12.     i = @@MultiByteToWideChar.call(65001, 0 , self, -1, nil,0)
  13.     buffer = "\0" * (i*2)
  14.     @@MultiByteToWideChar.call(65001, 0 , self, -1, buffer, i)
  15.     i = @@WideCharToMultiByte.call(0, 0, buffer, -1, nil, 0, nil, nil)
  16.     result = "\0" * i
  17.     @@WideCharToMultiByte.call(0, 0, buffer, -1, result, i, nil, nil)
  18.     result.chop!
  19.     return result
  20.   end

  21.   def s2u
  22.     i = @@MultiByteToWideChar.call(0, 0, self, -1, nil, 0)
  23.     buffer = "\0" * (i*2)
  24.     @@MultiByteToWideChar.call(0, 0, self, -1, buffer, buffer.size / 2)
  25.     i = @@WideCharToMultiByte.call(65001, 0, buffer, -1, nil, 0, nil, nil)
  26.     result = "\0" * i
  27.     @@WideCharToMultiByte.call(65001, 0, buffer, -1, result, result.size, nil, nil)
  28.     result.chop!
  29.     return result
  30.   end
  31. end
复制代码

作者: 雨落忧伤    时间: 2017-12-11 09:19
fux2 发表于 2017-12-10 23:06
在你的脚本最上面插入一页新页,粘贴以下内容,
然后变量设置的地方改成
ENV['UserName'].s2u

感谢……不过仍然出现了报错,不知道还有办法解决吗?
我把刚才那段脚本放到了最顶部,然后试了一下就是这样了——

QQ图片20171211091810.png (28.1 KB, 下载次数: 28)

QQ图片20171211091810.png

作者: 喵呜喵5    时间: 2017-12-11 09:43
本帖最后由 喵呜喵5 于 2017-12-11 09:45 编辑

插入脚本:
  1. class Game_Interpreter
  2.   def m5_20171211_username(v=nil)
  3.     str = ENV['UserName'].dup
  4.     m2w = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
  5.     w2m = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
  6.     i = m2w.call(0, 0, str, -1, nil, 0)
  7.     buffer = "\0" * (i*2)
  8.     m2w.call(0, 0, str, -1, buffer, buffer.size / 2)
  9.     i = w2m.call(65001, 0, buffer, -1, nil, 0, nil, nil)
  10.     result = "\0" * i
  11.     w2m.call(65001, 0, buffer, -1, result, result.size, nil, nil)
  12.     result.chop!
  13.     $game_variables[v] = result if v
  14.     return result
  15.   end
  16. end
复制代码


事件的脚本指令中输入:
  1. m5_20171211_username(2)
复制代码

则 2 号变量的值就是当前的用户名,之后在对话中输入 \v[2] 即可显示对应文本
作者: chd114    时间: 2017-12-11 13:25
雨落忧伤 发表于 2017-12-10 18:18
多谢提醒,已经尝试了。
确实不会报错了,但是有了一个新的问题,那就是显示出来的是一些无法识别的字符 ...

缺失的是中文吗?




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