赞 | 1 |
VIP | 0 |
好人卡 | 3 |
积分 | 3 |
经验 | 3883 |
最后登录 | 2023-12-21 |
在线时间 | 125 小时 |
Lv2.观梦者
- 梦石
- 0
- 星屑
- 270
- 在线时间
- 125 小时
- 注册时间
- 2009-12-16
- 帖子
- 155
|
帮你修正顺便精简了,目测你的问题出在pData,由于是utf-16,因此第二个字节通常会是0x00(null),於是ruby就停止读取了,直接用hclip把相对应需要的数据及长度复制到ruby里的字符串就行了,至于转码pack和unpack可以使utf-16与utf-8之间的转码变得轻松
- 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))
- @wcslen = Win32API.new('msvcrt', 'wcslen', %(i), %(I))
- @memmove = Win32API.new('msvcrt', 'memmove', %(p, l, l), %(p))
-
- # 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))
- CF_UNICODETEXT = 13 # UTF-16
- # 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 = @wcslen.call(hClip)
- buff = ([0]*[size,limit].min).pack('S*')
- @memmove.call(buff, hClip, buff.unpack('C*').size)
- str = buff.unpack('S*').pack('U*')
- #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
- Clipboard.GetContent
复制代码
假设粘帖板的数据是“ABCD”那么在内存里hClip所在的数据为:[0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00],因为每个字符是2字节,因此在这里的一切没用widechar来操作的话根本不行。 |
评分
-
查看全部评分
|