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
RUBY 代码复制
  1. module Graphics
  2.   RtlMoveMemory          = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i')
  3.   BitBlt                 = Win32API.new('gdi32', 'BitBlt', 'iiiiiiiii', 'i')
  4.   CreateCompatibleBitmap = Win32API.new('gdi32', 'CreateCompatibleBitmap', 'iii', 'i')
  5.   CreateCompatibleDC     = Win32API.new('gdi32', 'CreateCompatibleDC', 'i', 'i')
  6.   DeleteObject           = Win32API.new('gdi32', 'DeleteObject', 'i', 'i')
  7.   GetDIBits              = Win32API.new('gdi32', 'GetDIBits', 'iiiiipi', 'i')
  8.   SelectObject           = Win32API.new('gdi32', 'SelectObject', 'ii', 'i')
  9.   SetDIBits              = Win32API.new('gdi32', 'SetDIBits', 'iiiiipi', 'i')
  10.   hWnd = Win32API.new('user32', 'FindWindow', 'pp', 'i').call('RGSS Player', 0)
  11.   DC   = Win32API.new('user32', 'GetDC', 'i', 'i').call(hWnd)
  12.   def self.snap_to_bitmap
  13.     bitmap = Bitmap.new(width=640, height=480)
  14.     RtlMoveMemory.call(address="\0"*4, bitmap.__id__*2+16, 4)
  15.     RtlMoveMemory.call(address, address.unpack('L')[0]+8, 4)
  16.     RtlMoveMemory.call(address, address.unpack('L')[0]+16, 4)
  17.     address = address.unpack('L')[0]
  18.     info = [40,width,height,1,32,0,0,0,0,0,0].pack('LllSSLLllLL')
  19.     hDC = CreateCompatibleDC.call(DC)
  20.     hBM = CreateCompatibleBitmap.call(DC, width, height)
  21.     DeleteObject.call(SelectObject.call(hDC, hBM))
  22.     SetDIBits.call(hDC, hBM, 0, height, address, info, 0)
  23.     BitBlt.call(hDC, 0, 0, width, height, DC, 0, 0, 0xCC0020)
  24.     GetDIBits.call(hDC, hBM, 0, height, address, info, 0)
  25.     DeleteObject.call(hBM)
  26.     DeleteObject.call(hDC)
  27.     bitmap
  28.   end
  29. end

作者: 晴兰    时间: 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! X3.1