2011-10-15 176 views
29

有没有一种方法可以在Node.js中复制到剪贴板?任何模块或想法都是如此吗?我在桌面应用程序上使用Node.js。希望这清楚了为什么我希望它能够实现这一点。复制到Node.js中的剪贴板?

回答

13

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

编辑:如果你想做些什么哈克,你也可以使用XCLIP:

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); 
}); 
2

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

我在Windows和创建VB.NET应用程序:在Node.js的

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 

然后,我用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 
    } 
); 
+0

您是否认为您可以直接在命令行中执行此操作?为此编写应用程序意味着我需要为Mac,Linux和Windows编译它。 – Tower

+0

@rFactor:我完全没有使用Mac/Linux的经验,但我并不知道内置的剪贴板命令。 – pimvdb

+1

在Windows上有一个'clip'命令,IIRC。 –

1

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,但替换pbcopyXclipapt get install xclip

+0

有趣!你认为有Windows方式也可以这么做吗?那么在我的程序中绑定xclip,因为我不想让用户安装xclip。 – Tower

+1

我发现Windows中有东西:'echo fooo | clip'。现在,如何在Linux中不要求用户安装某些东西? – Tower

+0

'echo fooo | clip'可以工作,但结果会在原始字符串的最后包含'\ n',这超出了我的期望。 – LIXer

21

这里是一个模块,提供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(用于windows)。

当我在REPL中为一个副项目做了大量工作时,该模块非常有用。不用说,copy-paste只是一个命令行实用程序 - 它是而不是意味着服务器工作。

+2

这是最好的答案。它是跨平台的,它的工作方式应该是这样。 – gilly3

40

对于OS X:

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

write()可以采取缓冲剂或字符串。字符串的默认编码将是utf-8。

-3

检查这个zeroclipboard

NPM安装zeroclipboard

+0

这似乎是用于浏览器,而不是NodeJS桌面应用程序。 –

+0

这也使用闪光灯,这似乎是一个坏主意。 – CallMeNorm

5

最短的方式在Windows中:

require('child_process').spawn('clip').stdin.end(util.inspect("content_for_the_clipboard")); 
+1

作品!谢谢你......但需要首先需要'util'。 – LIXer

+0

谢谢!不需要像'util'这样的依赖对我有用:require('child_process')。spawn('clip')。stdin.end(“content_for_the_clipboard”); – darmis

7

退房clipboardy。它可以让你复制/粘贴跨平台。在另一个答案中,它比copy-paste模块mentioned更积极地维护,它修复了该模块的许多问题。

const clipboardy = require('clipboardy'); 

// Copy 
clipboardy.writeSync(''); 

// Paste 
clipboardy.readSync(''); 
+1

此模块完美工作,维护良好。 – SamVerschueren

+0

它比“复制粘贴”模块更好,因为它也支持双字节字符。但是这与Windows 32位操作系统有关。 –

+1

@PonmudiVN Windows 32位支持已修复:https://github.com/sindresorhus/clipboardy/commit/3be3ee6b9b9cd736623fcc8ebb1aa9e0c42371b4 –