复制到 Ruby、HTML 或 C# 中的剪贴板
本文关键字:剪贴板 HTML Ruby 复制 | 更新日期: 2023-09-27 18:34:43
如何在 Ruby 中将文本复制到剪贴板?
听起来很简单吧?但是我已经尝试这样做了 5 天,但没有成功。
我在互联网上搜索,但我得到的只是如何在较新版本的 Ruby 中执行此操作(我使用的是 1.8.7,不,我不能使用较新版本(。
所以我尝试制作一个 HTML 文件来为我做这件事。在尝试了 4-5 种不同的方式(来自在线指南(、3 种浏览器,甚至查看了 Photobucket 的源代码以尝试弄清楚它如何复制 img 代码后,我放弃了。什么都不适合我。
所以我做了一个C#.exe,让我的Ruby程序调用它。最后,一些东西被发送到剪贴板。这是向前迈出的一步,但它仍然只是字符串中的第一个单词。当我尝试复制two words
时,只复制two
。
我的 Ruby 程序看起来像这样:
system ("CopyClip.exe #{text}")
在 C#(在 CopyClip 中(中,它确实:
Clipboard.set_text(args[0])
基本上,我不在乎你是否用Ruby,HTML,C#或任何其他语言帮助我做到这一点,只要它有效。
这个答案非常适合 OSX:
def pbcopy(input)
str = input.to_s
IO.popen('pbcopy', 'w') { |f| f << str }
str
end
def pbpaste
`pbpaste`
end
我怀疑如果您将参数包装在引号中到 C# 应用程序,您将获得args[0]
中的所有文本:
system("CopyClip.exe '#{text}'")
或者,如果您的文本包含撇号或其他特殊外壳字符,可能会更好:
system("CopyClip.exe", text)
或者更好的是,使用剪贴板 gem - 这在 1.8.7 上对我有用,但我无法在 Windows 上测试它:
require 'clipboard'
Clipboard.copy text
剪贴板 gem 允许您访问 Liunx、MacOS 和 Windows 上的剪贴板。重点是简单的文本。您可以使用 Clipboard.copy("字符串"( 复制字符串并将其粘贴Clipboard.paste()
.
基本上就是这样。
现在让我们仔细看看具体的平台。
-
Linux目录对于Linux支持,需要小实用程序xclip。您可以使用
sudo apt-get install xclip
将其安装在 Ubuntu 上。
此外,您可以选择要粘贴的剪贴板(默认为主剪贴板(。copy()
复制到Clipboard::CLIPBOARDS
中的所有剪贴板,例如Clipboard.paste :primary
。 -
苹果操作系统
在macOS上,它工作正常。
对于那些编写 GTK+ 应用程序(OP 不是(的人来说,写入剪贴板非常简单:
Gtk::Clipboard.get(Gdk::Selection::CLIPBOARD).set_text(content).store
也可以使用主 ( Gdk::Selection::PRIMARY
( 或辅助 (Gdk::Selection::SECONDARY
( X 选择。
另请参阅完整的 ruby API 及其底层 C API。
看起来您正在使用 Windows,这适用于 Windows 7 下的 Ruby 1.9.3。
有关原始答案,请参阅使用小提琴将 Ruby 复制到剪贴板
require 'open3'
module Clipboard; end
module Clipboard::Windows
extend self
CF_TEXT = 1
CF_UNICODETEXT = 13
GMEM_MOVEABLE = 2
# get ffi function handlers
begin
require 'ffi'
rescue LoadError
raise LoadError, 'Could not load the required ffi gem, install it with: gem install ffi'
end
module User32
extend FFI::Library
ffi_lib "user32"
ffi_convention :stdcall
attach_function :open, :OpenClipboard, [ :long ], :long
attach_function :close, :CloseClipboard, [ ], :long
attach_function :empty, :EmptyClipboard, [ ], :long
attach_function :get, :GetClipboardData, [ :long ], :long
attach_function :set, :SetClipboardData, [ :long, :long ], :long
end
module Kernel32
extend FFI::Library
ffi_lib 'kernel32'
ffi_convention :stdcall
attach_function :lock, :GlobalLock, [ :long ], :pointer
attach_function :unlock, :GlobalUnlock, [ :long ], :long
attach_function :size, :GlobalSize, [ :long ], :long
attach_function :alloc, :GlobalAlloc, [ :long, :long ], :long
end
# see http://www.codeproject.com/KB/clipboard/archerclipboard1.aspx
def paste(_ = nil)
ret = ""
if 0 != User32.open( 0 )
hclip = User32.get( CF_UNICODETEXT )
if hclip && 0 != hclip
pointer_to_data = Kernel32.lock( hclip )
data = ""
# Windows Unicode is ended by to null bytes, so get the whole string
size = Kernel32.size( hclip )
data << pointer_to_data.get_bytes( 0, size - 2 )
if RUBY_VERSION >= '1.9'
ret = data.force_encoding("UTF-16LE").encode(Encoding.default_external) # TODO catch bad encodings
else # 1.8: fallback to simple CP850 encoding
require 'iconv'
utf8 = Iconv.iconv( "UTF-8", "UTF-16LE", data)[0]
ret = Iconv.iconv( "CP850", "UTF-8", utf8)[0]
end
if data && 0 != data
Kernel32.unlock( hclip )
end
end
User32.close( )
end
ret || ""
end
def clear
if 0 != User32.open( 0 )
User32.empty( )
User32.close( )
end
paste
end
def copy(data_to_copy)
if ( RUBY_VERSION >= '1.9' ) && 0 != User32.open( 0 )
User32.empty( )
data = data_to_copy.encode("UTF-16LE") # TODO catch bad encodings
data << 0
handler = Kernel32.alloc( GMEM_MOVEABLE, data.bytesize )
pointer_to_data = Kernel32.lock( handler )
pointer_to_data.put_bytes( 0, data, 0, data.bytesize )
Kernel32.unlock( handler )
User32.set( CF_UNICODETEXT, handler )
User32.close( )
else # don't touch anything
Open3.popen3( 'clip' ){ |input,_,_| input << data_to_copy } # depends on clip (available by default since Vista)
end
paste
end
end
Clipboard::Windows.copy("test")
puts Clipboard::Windows.paste
在我的收藏中,我有另一个曾经在 Windows 7 32 位中工作的脚本,如果您在使用第一个脚本时遇到问题并且只使用 32 位,请尝试这个
#!/usr/bin/env ruby -w
# win32 only
require 'singleton'
require 'thread'
require 'Win32API'
class Clipboard
include Singleton
CF_TEXT = 1
def initialize
@@mutex = Mutex.new
@@open = Win32API.new("user32","OpenClipboard",['L'],'L')
@@close = Win32API.new("user32","CloseClipboard",[],'L')
@@empty = Win32API.new("user32","EmptyClipboard",[],'L')
@@set = Win32API.new("user32","SetClipboardData",['L','P'],'L')
@@get = Win32API.new("user32", "GetClipboardData", ['L'], 'L')
@@lock = Win32API.new("kernel32", "GlobalLock", ['L'], 'P')
@@unlock = Win32API.new("kernel32", "GlobalUnlock", ['L'], 'L')
end
def copy
@@mutex.synchronize do
@@open.Call(0)
str = @@lock.Call(@@get.Call(CF_TEXT))
@@unlock.Call(@@get.Call(CF_TEXT))
@@close.Call
return str
end
end
def paste(str)
@@mutex.synchronize do
@@open.Call(0)
@@empty.Call
@@set.Call(CF_TEXT, str)
@@close.Call
@@lock = Win32API.new("kernel32", "GlobalLock", ['L'], 'P')
@@unlock = Win32API.new("kernel32", "GlobalUnlock", ['L'], 'L')
return nil
end
end
end
clip = Clipboard.instance
puts clip.copy
puts str
clip.paste("foo")
puts clip.copy
如果您不介意安装 gem,这里有一个更简单的解决方案,适用于 windows7 64 位、Ruby 1.9.3。
#gem install clipboard
require 'clipboard'
Clipboard.copy("This is a sentence that has been copied to your clipboard")
puts Clipboard.paste