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 空字节,那就从这个字节开始之后的都会被抛弃,于是只能通过内存地址来拷贝了:
OpenClipboard = Win32API.new("user32", "OpenClipboard", "l", "l")
GetClipboardData = Win32API.new("user32", "GetClipboardData", "l", "l")
GlobalLock = Win32API.new("kernel32", "GlobalLock", "l", "i")
GlobalUnlock = Win32API.new("kernel32", "GlobalUnlock", "l", "l")
GlobalSize = Win32API.new("kernel32", "GlobalSize", "i", "i")
RtlMoveMemory = Win32API.new("kernel32", "RtlMoveMemory", "pii", "v")
CloseClipboard = Win32API.new("user32", "CloseClipboard", "v", "l")
if(OpenClipboard.call(0))
hClip = GetClipboardData.call(13)
len = GlobalSize.call(hClip)
str = " " * len
RtlMoveMemory.call(str, GlobalLock.call(hClip), len)
GlobalUnlock.call(hClip)
CloseClipboard.call
p str
print str.to_UTF8
end
复制代码
作者:
「旅」
时间:
2010-6-26 15:17
><麻烦紫苏大人了~~~都是浮云,别客气~
欢迎光临 Project1 (https://rpg.blue/)
Powered by Discuz! X3.1