查看: 2364|回复: 7

[已经解决] 【20VIP】求两个API~

[复制链接]

小柯的徒弟

梦石
0
星屑
1925
在线时间
1157 小时
注册时间
2008-5-24
回帖
2994

贵宾

发表于 2010-6-26 10:05:54 | 显示全部楼层 |阅读模式

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

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

×
1.复制某个文件到另一个文件夹中。

2.读取黏贴板的文字数据,要求可以连同\n也黏贴。

点评

这两个问题完全不值20VIP,我看小旅悬赏2VIP就够了……  发表于 2010-6-26 14:25
梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
回帖
1912
发表于 2010-6-26 10:43:32 | 显示全部楼层
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 就是剪切板数据,前提得是文字格式

评分

参与人数 1赞 +40 收起 理由
「旅」 + 40 谢谢紫苏~~><

查看全部评分

回复

使用道具 举报

孤独守望

梦石
0
星屑
3144
在线时间
1535 小时
注册时间
2006-10-16
回帖
4223

开拓者贵宾

发表于 2010-6-26 10:47:48 | 显示全部楼层
中文悲剧……邪笑望楼上

点评

紫苏一招“猛虎出柙”正中 IamI 面门,让你笑!  发表于 2010-6-26 12:47
菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复

使用道具 举报

小柯的徒弟

梦石
0
星屑
1925
在线时间
1157 小时
注册时间
2008-5-24
回帖
2994

贵宾

 楼主| 发表于 2010-6-26 10:57:49 | 显示全部楼层
回复 紫苏 的帖子


    紫苏大人~~><那个第二个不可以显示中文。

评分

参与人数 1星屑 +132 赞 -40 收起 理由
凌辰 + 132 -40 我是路过的嗯。

查看全部评分

回复

使用道具 举报

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
回帖
1912
发表于 2010-6-26 11:12:39 | 显示全部楼层
如果需要中文,先弄转码方法:
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
回复

使用道具 举报

小柯的徒弟

梦石
0
星屑
1925
在线时间
1157 小时
注册时间
2008-5-24
回帖
2994

贵宾

 楼主| 发表于 2010-6-26 11:29:08 | 显示全部楼层
回复 紫苏 的帖子


    我发现复制编辑器里的可以,但是论坛的却不能。有办法解决吗?(没有的话也没关系)
回复

使用道具 举报

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
回帖
1912
发表于 2010-6-26 12:41:46 | 显示全部楼层
呃,刚才也发现了有这个问题——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
复制代码
回复

使用道具 举报

小柯的徒弟

梦石
0
星屑
1925
在线时间
1157 小时
注册时间
2008-5-24
回帖
2994

贵宾

 楼主| 发表于 2010-6-26 15:17:04 | 显示全部楼层
><麻烦紫苏大人了~~~都是浮云,别客气~
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部