19

Rubyでテキストをクリップボードにコピーするにはどうすればよいですか?

シンプルですね。しかし、私はこれを5日間試みましたが、成功しませんでした。

インターネットで検索しましたが、Rubyの新しいバージョンでそれを行う方法しか得られませんでした(1.8.7を使用していますが、新しいバージョンは使用できません)。

そこで、HTML ファイルを作成してみました。3 つのブラウザーで (オンライン ガイドから) 4 ~ 5 の異なる方法を試した後、Photobucket のソース コードを調べて img コードをコピーする方法を見つけようとした後、あきらめました。何もうまくいきませんでした。

そこで、C# .exe を作成し、Ruby プログラムで呼び出すようにしました。最後に、何かがクリップボードに送信されています。これは一歩前進ですが、それでも文字列の最初の単語にすぎません。コピーしようとするtwo wordsと、 だけtwoがコピーされます。

私のRubyプログラムは次のようになります。

system  ("CopyClip.exe #{text}")

C# (CopyClip) では、次のようになります。

Clipboard.set_text(args[0])

基本的に、Ruby、HTML、C#、または他の言語でそれを行うのを手伝ってくれても、それが機能する限り気にしません。

4

5 に答える 5

51

この答えはOSXに最適です:

def pbcopy(input)
 str = input.to_s
 IO.popen('pbcopy', 'w') { |f| f << str }
 str
end

def pbpaste
 `pbpaste`
end
于 2014-04-17T18:51:49.647 に答える
6

clipboard gem を使用すると、Liunx、MacOS、および Windows でクリップボードにアクセスできます。シンプルな文章が中心です。Clipboard.copy("string") で文字列をコピーし、 で貼り付けることができますClipboard.paste()
基本的にはそれだけです。

次に、特定のプラットフォームを詳しく見てみましょう。

  • Linux Linux をサポートするには、小さなユーティリティ xclip が必要です。でUbuntuにインストールできますsudo apt-get install xclip
    さらに、どのクリップボードから貼り付けるかを選択できます (デフォルトは PRIMARYCLIPBOARD)。たとえばcopy()のすべてのクリップボードにコピーします。Clipboard::CLIPBOARDSClipboard.paste :primary

  • macOS macOS では
    問題なく動作します。

于 2014-03-31T14:23:22.913 に答える
0

Windows を使用しているようですが、これは Windows 7 の Ruby 1.9.3 で動作します。

元の回答については、Ruby copy to clipboard with Fiddle を参照してください。

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
于 2015-12-19T13:08:32.317 に答える