设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2027|回复: 7
打印 上一主题 下一主题

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

[复制链接]

Lv3.寻梦者

小柯的徒弟

梦石
0
星屑
1505
在线时间
1157 小时
注册时间
2008-5-24
帖子
3085

贵宾

跳转到指定楼层
1
发表于 2010-6-26 10:05:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

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

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

点评

这两个问题完全不值20VIP,我看小旅悬赏2VIP就够了……  发表于 2010-6-26 14:25

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
2
发表于 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 谢谢紫苏~~><

查看全部评分

回复 支持 反对

使用道具 举报

Lv3.寻梦者

孤独守望

梦石
0
星屑
3132
在线时间
1535 小时
注册时间
2006-10-16
帖子
4321

开拓者贵宾

3
发表于 2010-6-26 10:47:48 | 只看该作者
中文悲剧……邪笑望楼上

点评

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

使用道具 举报

Lv3.寻梦者

小柯的徒弟

梦石
0
星屑
1505
在线时间
1157 小时
注册时间
2008-5-24
帖子
3085

贵宾

4
 楼主| 发表于 2010-6-26 10:57:49 | 只看该作者
回复 紫苏 的帖子


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

评分

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

查看全部评分

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
5
发表于 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
回复 支持 反对

使用道具 举报

Lv3.寻梦者

小柯的徒弟

梦石
0
星屑
1505
在线时间
1157 小时
注册时间
2008-5-24
帖子
3085

贵宾

6
 楼主| 发表于 2010-6-26 11:29:08 | 只看该作者
回复 紫苏 的帖子


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

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
7
发表于 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
复制代码
回复 支持 反对

使用道具 举报

Lv3.寻梦者

小柯的徒弟

梦石
0
星屑
1505
在线时间
1157 小时
注册时间
2008-5-24
帖子
3085

贵宾

8
 楼主| 发表于 2010-6-26 15:17:04 | 只看该作者
><麻烦紫苏大人了~~~都是浮云,别客气~
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-9-23 13:15

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表