JSA里的FFI(5)——剪贴板
wils
创作者俱乐部成员
原来JS宏里要操作剪贴板,可以创建一个临时的文本框,然后调用Copy Paste方法,然后读取他的TextRange,有点麻烦且不够灵活
有了FFI,就可以更灵活的判断剪贴板的内容类型并操作
同时JSA对unicode字符串的支持也比VBA好多了
function aa()
{
const kernel32 = FFI.LoadLibrary('kernel32')
const user32 = FFI.LoadLibrary('user32')
const OpenClipboard = user32.LoadFunction('', 'OpenClipboard', '', 'bool', ['pointer'])
const CloseClipboard = user32.LoadFunction('', 'CloseClipboard', '', 'bool', [])
const IsClipboardFormatAvailable = user32.LoadFunction('', 'IsClipboardFormatAvailable', '', 'bool', ['uint32'])
const GetClipboardData = user32.LoadFunction('', 'GetClipboardData', '', 'pointer', ['uint32'])
const GlobalLock = kernel32.LoadFunction('', 'GlobalLock', '', 'pointer', ['pointer'])
const GlobalUnlock = kernel32.LoadFunction('', 'GlobalUnlock', '', 'bool', ['pointer'])
OpenClipboard.Call(null)
if (IsClipboardFormatAvailable.Call(13)) {
const h = GetClipboardData.Call(13)
const b = GlobalLock.Call(h)
console.log(b.DerefU16String())
GlobalUnlock(h)
} else if (IsClipboardFormatAvailable.Call(1)) {
const h = GetClipboardData.Call(1)
const b = GlobalLock.Call(h)
console.log(b.DerefString())
GlobalUnlock(h)
}
CloseClipboard.Call()
}前几行还是老套路,导入了所需要的几个函数
打开剪贴板
判断是否有unicodetext
如果有,获取句柄,锁定,读u16字符串,解锁
再判断是否有ansitext
如果有,获取句柄,锁定,读普通字符串,解锁
关闭剪贴板
由于只是演示,写的非常简陋(包括之前的帖子)
正常使用时,一定要加上判断error
总的来说,FFI可方便太多了!