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

Project1

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

[已经解决] 后台运行脚本切屏后游戏会卡死,怎么解决

[复制链接]

Lv3.寻梦者

梦石
0
星屑
2865
在线时间
427 小时
注册时间
2014-11-21
帖子
144
跳转到指定楼层
1
发表于 2020-8-30 11:11:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
  1. #------------------------------------------------------------------------
  2. #                                             -----SixRC      2017.11.02
  3. #     后台运行脚本 含失去焦点时屏蔽键盘鼠标功能
  4. #      
  5. #        使用前请务必阅读此  否则脚本会失败
  6. #     使用为 BGR.bgr(bool) true为开启 false关闭 默认true
  7. #   BGR.update为在窗口失去或获得焦点时对于是否屏蔽键盘鼠标的刷新
  8. #   下面的注释那里把它放进了Graphics.update  请自行选择要不要这样
  9. #       然后
  10. #      因为这个脚本涉及到对具体dll的修改 不同的dll情况不同
  11. #   下面是不同dll对应的地址 请在 45 行开始自行修改DLL名和偏移地址及第二部分大小
  12. #   除DLL外需要修改三处地方 见下面 47 48 行
  13. #   RGSS103J                0x2E48     \x46  
  14. #   RGSS102J 100J           0x2E09     \x46
  15. #   RGSS104E                0x4FA4     \x5F
  16. #   RGSS200J 200E 202E      0x19AA     \x35
  17. #   RGSS300  301            0x2712     \x5A
  18. #------------------------------------------------------------------------
  19. module BGR
  20.   module_function
  21.   GetActiveWindow=Win32API.new('user32','GetActiveWindow','v','l')
  22.   Hwnd=GetActiveWindow.call
  23.   User32=Win32API.new('kernel32','LoadLibraryA','p','l').call("user32")
  24.   GetAsyncKeyState=Win32API.new('kernel32','GetProcAddress','lp','l').call(User32,'GetAsyncKeyState')
  25.   GetKeyState=Win32API.new('kernel32','GetProcAddress','lp','l').call(User32,'GetKeyState')
  26.   WriteProcessMemory=Win32API.new('kernel32','WriteProcessMemory','llpll','l')
  27.   Original="\0"*5
  28.   OriginalVA="\0"*5
  29.   Mask="\x31\xC0\xC2\x04\x00"
  30.   Win32API.new('kernel32','ReadProcessMemory','llpll','l').call(-1,GetAsyncKeyState,Original,5,0)
  31.   Win32API.new('kernel32','ReadProcessMemory','llpll','l').call(-1,GetKeyState,OriginalVA,5,0)
  32.   @state=0   
  33.   def update
  34.     if @state==0 && Hwnd != GetActiveWindow.call
  35.       WriteProcessMemory.call(-1,GetAsyncKeyState,Mask,5,0) if $game_variables!=nil
  36.       WriteProcessMemory.call(-1,GetKeyState,Mask,5,0) if $game_variables!=nil
  37.       return @state=1
  38.     end
  39.     if @state==1 && Hwnd == GetActiveWindow.call
  40.       WriteProcessMemory.call(-1,GetAsyncKeyState,Original,5,0) #if $game_variables!=nil
  41.       WriteProcessMemory.call(-1,GetKeyState,OriginalVA,5,0) #if $game_variables!=nil
  42.       return @state=0
  43.     end
  44.   end
  45.   DLL=Win32API.new('kernel32','LoadLibrary','p','l').call('RGSS103J')
  46.   def bgr(x=true)
  47.     WriteProcessMemory.call(-1,DLL+0x2E48,"\0",1,0) if x
  48.     WriteProcessMemory.call(-1,DLL+0x2E48,"\x46",1,0) unless x
  49.   end
  50. end
  51. #整合进 Graphics.update 请选择性使用
  52. class << Graphics
  53.   alias update_BGR update
  54.   def update
  55.     BGR.update #if $scene.is_a?(Scene_Map)
  56.     update_BGR
  57.   end
  58. end
  59. #使用
复制代码

这是SixRC大大写的后台运行脚本,但如果运行的话在游戏开始前切到别的窗口(如qq),回来后就会卡死无法行动。
我理解这是屏蔽了键盘后没有触发恢复导致的,尝试在上面加入一些条件;可以看到我加入了if $game_variables!=nil的条件,这样就不会在标题画面屏蔽,避免进游戏卡死。
但之后我又发现这么做后有时候在游戏内的下级窗口(比如开了一个合成窗口)后切屏截个图之类的又会卡死
感觉玩家游戏时还是有可能会切出去qq或者截屏的吧?这样直接卡死似乎对体验感很不好,感觉我这么堵不是个头,有没有什么更好的解决办法?

Lv4.逐梦者

梦石
0
星屑
13559
在线时间
2753 小时
注册时间
2014-10-4
帖子
756

R考场第七期纪念奖

2
发表于 2020-8-30 11:44:43 | 只看该作者
原因是用 GetActiveWindow 获取游戏句柄
假如游戏未打卡时切到别的窗口
读到的句柄就是错的 导致后续判断全错
这是偷懒时候的写法 确实有bug
RUBY 代码复制
  1. dll_name="RGSS103J"
  2. DLL=Win32API.new('kernel32','GetModuleHandle','p','l').call(dll_name)
  3. code = [139,68,36,4,139,128,196,182,18,0,139,64,8,194,16,0].pack('C*')
  4. Hwnd = Win32API.new('user32.dll','CallWindowProc','pllll','l').call(code,DLL,0,0,0)

你把取句柄的代码改成这段再测试一下
应该没问题了 别的你改的改回去吧..

现在不在家 这是猜的 有问题再说

点评

试了几下看起来是解决了,之前没想到这个原因,还是想得不够充分。谢谢大佬!  发表于 2020-8-31 01:27

评分

参与人数 1星屑 +50 +1 收起 理由
RyanBern + 50 + 1 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-27 10:20

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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