赞 | 0 |
VIP | 1 |
好人卡 | 0 |
积分 | 1 |
经验 | 2816 |
最后登录 | 2017-8-19 |
在线时间 | 194 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 50
- 在线时间
- 194 小时
- 注册时间
- 2010-10-12
- 帖子
- 281
|
加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 新手小白 于 2017-8-12 17:36 编辑
代码:
# 参考: https://github.com/janlelis/clip ... lipboard/windows.rb
module Clipboard
# kernel32
# (hMem: HGLOBAL) -> LPVOID
@GlobalLock = Win32API.new("kernel32", "GlobalLock",%(p), %(p))
@GlobalUnlock = Win32API.new("kernel32", "GlobalUnlock",%(l), %(l))
@GlobalSize = Win32API.new("kernel32", "GlobalSize",%(l), %(l))
@WideCharToMultiByte = Win32API.new('kernel32', 'WideCharToMultiByte', 'ilpipipp', 'i')
@GetACP = Win32API.new("kernel32", "GetACP", %(v), %(i))
# Maps a character string to a UTF-16 (wide character) string. The character string is not necessarily from a multibyte character set.
@MultiByteToWideChar = Win32API.new('kernel32', 'MultiByteToWideChar', 'ilpipi', 'i')
@CopyMemory = Win32API.new('msvcrt', 'memcpy', %(p, p, l), %(p)) #Win32API.new('kernel32', 'CopyMemory', %(p, p, l), %(v))
# user32
# (hWndNewOwner: HWND) -> BOOL
@OpenCLipboard = Win32API.new("user32", "OpenClipboard",%(l), %(l))
@CloseClipboard = Win32API.new("user32", "CloseClipboard",'', %(l))
# (uFormat: UINT) -> HANDLE
@GetClipboardData = Win32API.new("user32", "GetClipboardData",%(i), %(l))
@FindWindow = Win32API.new("user32", "FindWindow", 'pp', 'i')
CF_TEXT = 1
CF_UNICODETEXT = 13 # UTF-16
CP_UTF8 = 65001
CP_ACP = 0
#CP_MACCP = 2
CP_THREAD_ACP = 3
CP_GBK = 936
# CF_UNICODETEXT -> WideCharToMultiByte
def self.GetContent(limit=3*6)
begin
if @OpenCLipboard.call(0) != 0
hClip = @GetClipboardData.call(CF_UNICODETEXT)
if hClip && hClip != 0
pData = @GlobalLock.call(hClip)
size = @GlobalSize.call(hClip)
#@CopyMemory.call(buf, pData, size)
#acp = @GetACP.call()
#p acp
#p CP_THREAD_ACP
#utf16Len = @MultiByteToWideChar.call(CP_ACP, 0, pData, size, nil, 0)
#p utf16Len
#utf16Str = "\0" * (limit * 2)
#@MultiByteToWideChar.call(CP_ACP, 0, pData, size, utf16Str, limit)
str = "\0" * (limit < size/2 ? limit : size)
@WideCharToMultiByte.call (CP_UTF8, 0, pData, size/2, str, limit, nil, nil)
#str.delete!("\0")
p str
@GlobalUnlock.call(hClip)
end
@CloseClipboard.call()
end
return str || ""
#rescue
# return nil
end
end
end
作用: 获取剪贴板中的内容. 游戏中角色名字不能随便起, 想workaround一下
现象:
"糖葫芦""啊啊啊""あああ" => 正常
"abc""RMXP""#123" => 只有第一个字符显示正常, 后面都是垃圾, 每次调用都有部分会变, 而且有时能能出现某部分脚本的代码...
"牛肉面abc""可达鸭###" => 从第一个ASCII字符开始出现上述垃圾内容
顺便, 我电脑的系统不是Windows, 所以我用XP虚拟机运行RMXP.
我发现如果把参数设成CF_TEXT, 在虚拟机内复制的文本会返回utf-8编码的字符串, 在虚拟机外复制的文本会返回GBK, 因为无法直接判断是从哪里复制的, 所以就放弃了... 而且, wine下获取到的字符串中的Unicode字符会显示成"?"...
心好累... 已经快浪费两天时间了...
|
|