在 Node.js 中复制到剪贴板?

有没有办法可以在 Node.js 中复制到剪贴板?有什么模块或想法吗?我正在桌面应用程序上使用 Node.js。希望这能解释为什么我希望它能够实现这个目标。

89263 次浏览

我设法通过创建一个不同的应用程序来处理这个问题。这当然不是最好的方式,但它的工作。

我在 Windows 上创建了一个 VB.NET 应用程序:

Module Module1


Sub Main()
Dim text = My.Application.CommandLineArgs(0)
My.Computer.Clipboard.SetText(text)
Console.Write(text) ' will appear on stdout
End Sub
End Module

然后在 Node.js 中,我使用 child_process.exec运行 VB.NET 应用程序,将要复制的数据作为命令行参数传递:

require('child_process').exec(
"CopyToClipboard.exe \"test foo bar\"",


function(err, stdout, stderr) {
console.log(stdout); // to confirm the application has been run
}
);

剪贴板不是操作系统固有的。它是操作系统正在运行的任何窗口系统的构造。例如,如果你想在 x 上运行这个程序,你需要绑定到 Xlib 和/或 XCB。节点的 Xlib 绑定实际上存在: https://github.com/mixu/nwm。尽管我不确定它是否允许您访问 X 剪贴板,但您可能最终会自己编写。对于窗口,需要单独的绑定。

Edit: 如果你想做一些 hacky 的东西,你也可以使用 xlip:

var exec = require('child_process').exec;


var getClipboard = function(func) {
exec('/usr/bin/xclip -o -selection clipboard', function(err, stdout, stderr) {
if (err || stderr) return func(err || new Error(stderr));
func(null, stdout);
});
};


getClipboard(function(err, text) {
if (err) throw err;
console.log(text);
});

对于这种用例,Mac 有一个本地命令行 pbcopy:

require('child_process').exec(
'echo "test foo bar" | pbcopy',


function(err, stdout, stderr) {
console.log(stdout); // to confirm the application has been run
}
);

Linux 的代码相同,但是用 弹夹(apt get install xclip)替换 pbcopy

下面是一个提供 copypaste函数的模块: https://github.com/xavi-/node-copy-paste

执行 require("copy-paste").global()时,将添加两个全局函数:

> copy("hello") // Asynchronously adds "hello" to clipbroad
> Copy complete
> paste() // Synchronously returns clipboard contents
'hello'

像上面提到的许多其他答案一样,要复制和粘贴节点,需要调用外部程序。对于 node-copy-paste,它调用 pbcopy/pbpaste(用于 OSX)、 xclip(用于 linux)和 clip(用于窗口)。

当我为一个副项目在 REPL 中做大量工作时,这个模块非常有帮助。不用说,copy-paste只是一个命令行实用程序——它是用于服务器工作的 没有

对于 OS X:

function pbcopy(data) {
var proc = require('child_process').spawn('pbcopy');
proc.stdin.write(data); proc.stdin.end();
}

write()可以采用缓冲区或字符串。字符串的默认编码为 utf-8。

看看这个 写字板

安装零剪贴板

Windows 中的最短路径:

const util = require('util');
require('child_process').spawn('clip').stdin.end(util.inspect('content_for_the_clipboard'));

看看 clipboardy。它允许您跨平台复制/粘贴。在另一个答案中,它比 copy-paste模块 提到维护得更积极,并且修复了该模块的许多问题。

const clipboardy = require('clipboardy');


// Copy
clipboardy.writeSync('🦄');


// Paste
clipboardy.readSync();
//🦄

我看到这里没有一个解决方案或任何地方明显可以适用于 Windows,所以重新发布 这个发现在谷歌搜索的第2页深处,使用 Windows 本地命令行 clip,并避免任何潜在的混乱使用命令行的变通方法,如上面建议的 echo foo | clip

  var cp = require("child_process");
var child = cp.spawn('clip');
child.stdin.write(result.join("\n"));
child.stdin.end();

希望这对谁有帮助!

这是您在 node-ffi for windows 上的操作方式,它直接与来自 windows 的 本地剪贴板应用程序接口交互。(这意味着你也可以读写不同的剪贴板格式)

var {
winapi,
user32,
kernel32,
constants
} = require('@kreijstal/winffiapi')
const GMEM_MOVEABLE=0x2;
var stringbuffer=Buffer.from("hello world"+'\0');//You need a null terminating string because C api.
var hmem=kernel32.GlobalAlloc(GMEM_MOVEABLE,stringbuffer.length);
var lptstr = kernel32.GlobalLock(hmem);
stringbuffer.copy(winapi.ref.reinterpret(lptstr, stringbuffer.length));
kernel32.GlobalUnlock(hmem);
if (!user32.OpenClipboard(0)){
kernel32.GlobalLock(hmem);
kernel32.GlobalFree(hmem);
kernel32.GlobalUnlock(hmem);
throw new Error("couldn't open clipboard");
}
user32.EmptyClipboard();
user32.SetClipboardData(constants.clipboardFormats.CF_TEXT, hmem);
user32.CloseClipboard();