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

Project1

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

[已经解决] GetClipboardData(CF_UNICODETEXT) 从第一个ascii字符后内容半随机

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
194 小时
注册时间
2010-10-12
帖子
281
跳转到指定楼层
1
发表于 2017-8-12 17:16:20 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

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

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

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字符会显示成"?"...

心好累... 已经快浪费两天时间了...
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

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

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

GMT+8, 2024-5-7 13:09

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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