Project1

标题: 【20VIP】求两个API~ [打印本页]

作者: 「旅」    时间: 2010-6-26 10:05
标题: 【20VIP】求两个API~
1.复制某个文件到另一个文件夹中。

2.读取黏贴板的文字数据,要求可以连同\n也黏贴。
作者: 紫苏    时间: 2010-6-26 10:43
1、
CopyFile = Win32API.new("kernel32", "CopyFile", "ppi", "i")
CopyFile.call("split.avi", "Data/split.avi", 0)

复制游戏目录下的 split.avi 到 Data 文件夹下,最后一个参数 0 表示覆盖同名文件

2、
OpenClipboard = Win32API.new("user32", "OpenClipboard", "l", "l")
GetClipboardData = Win32API.new("user32", "GetClipboardData", "l", "l")
GlobalLock= Win32API.new("kernel32", "GlobalLock", "l", "p")
GlobalUnlock = Win32API.new("kernel32", "GlobalUnlock", "l", "l")
CloseClipboard = Win32API.new("user32", "CloseClipboard", "v", "l")
if(OpenClipboard.call(0))
  hClip = GetClipboardData.call(1)
  str = GlobalLock.call(hClip)
  GlobalUnlock.call(hClip)
  CloseClipboard.call
  print str
end

上面的 str 就是剪切板数据,前提得是文字格式
作者: IamI    时间: 2010-6-26 10:47
中文悲剧……邪笑望楼上
作者: 「旅」    时间: 2010-6-26 10:57
回复 紫苏 的帖子


    紫苏大人~~><那个第二个不可以显示中文。
作者: 紫苏    时间: 2010-6-26 11:12
如果需要中文,先弄转码方法:
class String
  #--------------------------------------------------------------------------
  # ● 用来编码 Ruby 字符串、解码 unicode 的 两个 Windows API 函数
  #--------------------------------------------------------------------------
  @@MultiByteToWideChar = Win32API.new("kernel32", "MultiByteToWideChar", ['I', 'L', 'P', 'I', 'P', 'I'], 'I')
  @@WideCharToMultiByte = Win32API.new("kernel32", "WideCharToMultiByte", ['I', 'L', 'P', 'I', 'P', 'I', 'P', 'P'], 'I')
  #--------------------------------------------------------------------------
  # ● 返回将 Ruby UTF-8 字符串对象(本身)编码为 unicode 后的字符串
  #--------------------------------------------------------------------------
  def to_unicode
    # 65001: UTF-8 字符集编码(代码页)
    len = @@MultiByteToWideChar.call(65001, 0, self, -1, 0, 0) << 1
    buf =" " * len
    @@MultiByteToWideChar.call(65001, 0, self, -1, buf, len)
    return buf
  end
  #--------------------------------------------------------------------------
  # ● 返回将编码为 unicode 的字符串对象(本身)解码为 UTF-8 后的字符串
  #--------------------------------------------------------------------------
  def to_UTF8
    len = @@WideCharToMultiByte.call(65001, 0, self, -1, 0, 0, 0, 0)
    buf =" " * len
    @@WideCharToMultiByte.call(65001, 0, self, -1, buf, len, 0, 0)
    # 去掉 '\0' 字符串结束符(因为转换之后仅仅用于 Ruby 字符串)
    buf.slice!(-1, 1)
    return buf
  end
end

然后
1、
CopyFile = Win32API.new("kernel32", "CopyFileW", "ppi", "i")
CopyFile.call("中文杯具.avi".to_unicode, "Data/中文杯具.avi".to_unicode, 0)

2、
OpenClipboard = Win32API.new("user32", "OpenClipboard", "l", "l")
GetClipboardData = Win32API.new("user32", "GetClipboardData", "l", "l")
GlobalLock= Win32API.new("kernel32", "GlobalLock", "l", "p")
GlobalUnlock = Win32API.new("kernel32", "GlobalUnlock", "l", "l")
CloseClipboard = Win32API.new("user32", "CloseClipboard", "v", "l")
if(OpenClipboard.call(0))
  hClip = GetClipboardData.call(13)
  str = GlobalLock.call(hClip)
  GlobalUnlock.call(hClip)
  CloseClipboard.call
  print str.to_UTF8
end
作者: 「旅」    时间: 2010-6-26 11:29
回复 紫苏 的帖子


    我发现复制编辑器里的可以,但是论坛的却不能。有办法解决吗?(没有的话也没关系)
作者: 紫苏    时间: 2010-6-26 12:41
呃,刚才也发现了有这个问题——unicode 总是只能识别中文,但是 ASCII 字符却只能获取一个,调试了半天才发现原来是邪恶的 Win32API 对象在作祟,当调用 API 返回字符串的时候,它返回的是一个空终止的字符串,所以 unicode 里一旦有 \000 空字节,那就从这个字节开始之后的都会被抛弃,于是只能通过内存地址来拷贝了:
  1. OpenClipboard = Win32API.new("user32", "OpenClipboard", "l", "l")
  2. GetClipboardData = Win32API.new("user32", "GetClipboardData", "l", "l")
  3. GlobalLock = Win32API.new("kernel32", "GlobalLock", "l", "i")
  4. GlobalUnlock = Win32API.new("kernel32", "GlobalUnlock", "l", "l")
  5. GlobalSize = Win32API.new("kernel32", "GlobalSize", "i", "i")
  6. RtlMoveMemory = Win32API.new("kernel32", "RtlMoveMemory", "pii", "v")
  7. CloseClipboard = Win32API.new("user32", "CloseClipboard", "v", "l")

  8. if(OpenClipboard.call(0))
  9.   hClip = GetClipboardData.call(13)
  10.   len = GlobalSize.call(hClip)
  11.   str = " " * len
  12.   RtlMoveMemory.call(str, GlobalLock.call(hClip), len)
  13.   GlobalUnlock.call(hClip)
  14.   CloseClipboard.call
  15.   p str
  16.   print str.to_UTF8
  17. end
复制代码

作者: 「旅」    时间: 2010-6-26 15:17
><麻烦紫苏大人了~~~都是浮云,别客气~




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