查看: 5311|回复: 2

[原创发布] 后台运行脚本 通用

[复制链接]
梦石
0
星屑
13562
在线时间
2753 小时
注册时间
2014-10-4
回帖
705

R考场第七期纪念奖

发表于 2017-11-2 14:34:00 | 显示全部楼层 |阅读模式

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

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

×
在写上个脚本多窗体的时候 略微了解了rm内部的消息处理机制
知道它在收到 0x1C WM_ACTIVATEAPP  时会根据参数将一个内存值赋为1或者0
然后主循环中 判断这个内存值 1那么就运行 刷新  0 那么就还在主循环里面
然后 要后台运行 很简单的想法就是把判断后的条件跳改掉 就ok了
实际上也确实 就这样ok了  然后根据需要又写了一个 根据窗口是否有焦点决定是否屏蔽键盘鼠标的功能
大致 就这样吧
下面是脚本
[fold=后台运行][pre lang="ruby"]#------------------------------------------------------------------------
#                                             -----SixRC      2017.11.02
#     后台运行脚本 含失去焦点时屏蔽键盘鼠标功能
#      
#        使用前请务必阅读此  否则脚本会失败
#     使用为 BGR.bgr(bool) true为开启 false关闭 默认true
#   BGR.update为在窗口失去或获得焦点时对于是否屏蔽键盘鼠标的刷新
#   下面的注释那里把它放进了Graphics.update  请自行选择要不要这样
#       然后
#      因为这个脚本涉及到对具体dll的修改 不同的dll情况不同
#   下面是不同dll对应的地址 请在 45 行开始自行修改DLL名和偏移地址及第二部分大小
#   除DLL外需要修改三处地方 见下面 47 48 行
#   RGSS103J                0x2E48     \x46  
#   RGSS102J 100J           0x2E09     \x46
#   RGSS104E                0x4FA4     \x5F
#   RGSS200J 200E 202E      0x19AA     \x35
#   RGSS300  301            0x2712     \x5A
#------------------------------------------------------------------------
module BGR
  module_function
  GetActiveWindow=Win32API.new('user32','GetActiveWindow','v','l')
  Hwnd=GetActiveWindow.call
  User32=Win32API.new('kernel32','LoadLibraryA','p','l').call("user32")
  GetAsyncKeyState=Win32API.new('kernel32','GetProcAddress','lp','l').call(User32,'GetAsyncKeyState')
  GetKeyState=Win32API.new('kernel32','GetProcAddress','lp','l').call(User32,'GetKeyState')
  WriteProcessMemory=Win32API.new('kernel32','WriteProcessMemory','llpll','l')
  Original="\0"*5
  OriginalVA="\0"*5
  Mask="\x31\xC0\xC2\x04\x00"
  Win32API.new('kernel32','ReadProcessMemory','llpll','l').call(-1,GetAsyncKeyState,Original,5,0)
  Win32API.new('kernel32','ReadProcessMemory','llpll','l').call(-1,GetKeyState,OriginalVA,5,0)
  @state=0   
  def update
    if @state==0 && Hwnd != GetActiveWindow.call
      WriteProcessMemory.call(-1,GetAsyncKeyState,Mask,5,0)
      WriteProcessMemory.call(-1,GetKeyState,Mask,5,0)
      return @state=1
    end
    if @state==1 && Hwnd == GetActiveWindow.call
      WriteProcessMemory.call(-1,GetAsyncKeyState,Original,5,0)
      WriteProcessMemory.call(-1,GetKeyState,OriginalVA,5,0)
      return @state=0
    end
  end
  DLL=Win32API.new('kernel32','LoadLibrary','p','l').call('RGSS103J')
  def bgr(x=true)
    WriteProcessMemory.call(-1,DLL+0x2E48,"\0",1,0) if x
    WriteProcessMemory.call(-1,DLL+0x2E48,"\x46",1,0) unless x
  end
end
#整合进 Graphics.update 请选择性使用
class << Graphics
  alias update_BGR update
  def update
    BGR.update
    update_BGR
  end
end
#使用
BGR.bgr[/pre][/fold]
使用前请阅读说明 根据不同的dll改一下几个位置 对应的值我已经列出来了
使用十分简单 BGR.bgr 就好了 具体需求可以看脚本然后改

评分

参与人数 2星屑 +120 赞 +2 收起 理由
怪蜀黍 + 1 精品文章
fux2 + 120 + 1 精品文章

查看全部评分

老黄鸡

梦石
4
星屑
45700
在线时间
7948 小时
注册时间
2009-7-6
回帖
13338

MZ评测员RM创作大赛01组委会开拓者贵宾

发表于 2017-11-3 01:10:07 | 显示全部楼层
很正规的思路呢,我想的还是拿到消息处理函数之后在里面找处理WM_ACTIVATEAPP的部分然后全部nop掉2333

点评

233我开始也想这样 然后突然想到了更能偷懒的方法 果然嫌麻烦爱偷懒是人类进步的源泉吧  发表于 2017-11-3 02:26
RGDirect - DirectX驱动的RGSS,点我了解.
(排满,暂停)RM全系列成套系统定制请联系QQ1213237796
不接受对其他插件维护的委托
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部