JSA里的FFI(5)——剪贴板

wils
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可方便太多了!

海南省
浏览 182
2
6
分享
6 +1
3
2 +1
全部评论 3
 
恰同学少年
· 黑龙江省
回复
 
Ben
66666666666666666666
· 广东省
回复
 
Ben
666666
· 广东省
回复