Project1

标题: 【真·截图】无视窗口遮挡,RMXP的Graphics.snap_to_bitmap [打印本页]

作者: 晴兰    时间: 2015-2-18 01:51
提示: 作者被禁止或删除 内容自动屏蔽
作者: taroxd    时间: 2015-2-18 08:27
  1. Kernel.require 'c:/rmsfx/rmsfx'
复制代码
感觉好像很厉害的样子
作者: 7408    时间: 2015-2-19 17:38
感觉这功能真贴心~大赞~!
作者: 熊的选民    时间: 2016-5-15 06:14
请问楼主这个和国外的这个脚本在功能上有什么区别?
国外这个也没有遮挡之类的问题。
原文链接:http://www.hbgames.org/forums/viewtopic.php?f=12&t=75650
[pre lang="ruby"]module Graphics
  RtlMoveMemory          = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  BitBlt                 = Win32API.new('gdi32', 'BitBlt', 'iiiiiiiii', 'i')
  CreateCompatibleBitmap = Win32API.new('gdi32', 'CreateCompatibleBitmap', 'iii', 'i')
  CreateCompatibleDC     = Win32API.new('gdi32', 'CreateCompatibleDC', 'i', 'i')
  DeleteObject           = Win32API.new('gdi32', 'DeleteObject', 'i', 'i')
  GetDIBits              = Win32API.new('gdi32', 'GetDIBits', 'iiiiipi', 'i')
  SelectObject           = Win32API.new('gdi32', 'SelectObject', 'ii', 'i')
  SetDIBits              = Win32API.new('gdi32', 'SetDIBits', 'iiiiipi', 'i')
  hWnd = Win32API.new('user32', 'FindWindow', 'pp', 'i').call('RGSS Player', 0)
  DC   = Win32API.new('user32', 'GetDC', 'i', 'i').call(hWnd)
  def self.snap_to_bitmap
    bitmap = Bitmap.new(width=640, height=480)
    RtlMoveMemory.call(address="\0"*4, bitmap.__id__*2+16, 4)
    RtlMoveMemory.call(address, address.unpack('L')[0]+8, 4)
    RtlMoveMemory.call(address, address.unpack('L')[0]+16, 4)
    address = address.unpack('L')[0]
    info = [40,width,height,1,32,0,0,0,0,0,0].pack('LllSSLLllLL')
    hDC = CreateCompatibleDC.call(DC)
    hBM = CreateCompatibleBitmap.call(DC, width, height)
    DeleteObject.call(SelectObject.call(hDC, hBM))
    SetDIBits.call(hDC, hBM, 0, height, address, info, 0)
    BitBlt.call(hDC, 0, 0, width, height, DC, 0, 0, 0xCC0020)
    GetDIBits.call(hDC, hBM, 0, height, address, info, 0)
    DeleteObject.call(hBM)
    DeleteObject.call(hDC)
    bitmap
  end
end[/pre]
作者: 晴兰    时间: 2016-5-15 18:16
提示: 作者被禁止或删除 内容自动屏蔽
作者: 熊的选民    时间: 2016-5-15 22:07
本帖最后由 熊的选民 于 2016-5-15 22:28 编辑
晴兰 发表于 2016-5-15 18:16
关于何谓遮挡,熊大可以试试这个,里面有一个注释,从那里开始的三行可以换成常用的保存或者显示图片看效 ...


不管是用你给的那段代码自动移动窗口,还是手动把窗口移动到屏幕外,国外那个脚本都不会出现遮挡现象。不知道是不是因为我用的是windows 10?

但你的脚本有个好处是不用调用Graphics.update就可以立即截图。比如说在菜单里选择存档,若用你的脚本,可以让菜单消失,截图,再重新显示菜单,这样截图中不会出现菜单,玩家也看不到菜单的闪烁。国外的脚本就做不到。

获取窗口用Win32API.new('user32', 'FindWindow', 'pp', 'i').call('RGSS Player', 0)不可以吗?
作者: fux2    时间: 2016-7-17 18:34
虽然是老帖。。。但还是忍不住想问问。
最近突然有需求用到这个脚本,但发现在全屏状态下截图是黑屏,在16位色环境下也无法正常工作。不知道什么原因。。




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