2013-10-09 3 views
12

में क्लिपबोर्ड पर कॉपी करें आप रूबी में क्लिपबोर्ड पर टेक्स्ट कैसे कॉपी करते हैं?रुबी, एचटीएमएल या सी #

सरल अधिकार लगता है? लेकिन मैं बिना किसी सफलता के 5 दिनों के लिए ऐसा करने की कोशिश कर रहा हूं।

मैंने Google में खोज की, लेकिन मुझे यह मिला कि रूबी के नए संस्करणों में यह कैसे किया जाए (मैं 1.8.7 का उपयोग कर रहा हूं और नहीं, मैं एक नए संस्करण का उपयोग नहीं कर सकता)।

इसलिए मैंने एक HTML फ़ाइल को मेरे लिए करने की कोशिश की। 4-5 अलग-अलग तरीकों से (ऑनलाइन गाइड से), 3 ब्राउज़रों में, और यहां तक ​​कि फोटोबकेट के स्रोत कोड को देखने के बाद यह पता लगाने के लिए कि यह आईएमजी कोड की प्रतिलिपि कैसे बना रहा है, मैंने छोड़ दिया। मेरे लिए कुछ भी काम नहीं किया।

इसलिए मैंने सी # .exe बनाया और मेरा रूबी प्रोग्राम इसे कॉल किया। अंत में क्लिपबोर्ड पर कुछ भेजा जा रहा है। यह एक कदम आगे है, लेकिन फिर भी, यह स्ट्रिंग में केवल पहला शब्द है। जब मैं two words की प्रतिलिपि बनाने का प्रयास करता हूं, तो केवल two कॉपी किया जाता है।

मेरी रूबी कार्यक्रम इस प्रकार है:

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

और ग # (CopyClip में), यह करता है में:

Clipboard.set_text(args[0]) 

मूल रूप से, मुझे परवाह नहीं है अगर तुम मुझे उस में ऐसा करने में सहायता रुबी, एचटीएमएल, सी #, या किसी अन्य भाषा, जब तक यह काम करता है।

+0

क्या आपका सी # कोड 'Main' से स्ट्रिंग तर्क का उपयोग कर रहा है? असल में, कमांड लाइन तर्क? यदि तर्कों में कोई जगह है तो यह प्रत्येक स्पेस आइटम को एक अलग तर्क के रूप में मानेंगे। – gunr2171

+0

क्या आप जानते हैं कि रत्नों का उपयोग कैसे करें? यदि हां, तो यह आपकी मदद कर सकता है: https://github.com/janlelis/clipboard (यह Google में दूसरा लिंक है और बहुत अच्छा लग रहा है) और सी # – FLCL

उत्तर

3

मुझे लगता है अगर आप उद्धरण में अपने सी # अनुप्रयोग के लिए तर्क लपेट, आप args[0] में सभी पाठ मिल जाएगा:

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

वैकल्पिक रूप से, और शायद बेहतर स्थिति में अपने पाठ अक्षर लोप या अन्य विशेष खोल शामिल अक्षर:

system("CopyClip.exe", text) 

या शायद और भी बेहतर, का उपयोग clipboard gem - इस 1.8.7 पर मेरे लिए काम करता है, लेकिन मैं विंडोज पर यह परीक्षण करने के लिए नहीं कर पाए हैं:

require 'clipboard' 
Clipboard.copy text 
+0

में कोई आवश्यकता नहीं है मुझे लगता है कि C#/कमांड तर्क मूल्यों की तलाश में हैं डबल कोट्स में लपेटा जाना है। – gunr2171

+0

@ जैकोब एस, ओह आप – FLCL

+0

धन्यवाद! मैं सी # String.join विधि का उपयोग कर स्ट्रिंग फिर से विलय कर दिया। – yasmin

5

क्लिपबोर्ड मणि आपको लिनक्स, मैकोज़ और विंडोज पर क्लिपबोर्ड तक पहुंचने की अनुमति देता है।

फोकस सरल पाठ पर है। आप Clipboard.copy ("string") के साथ एक स्ट्रिंग की प्रतिलिपि बना सकते हैं और इसे क्लिपबोर्ड.paste के साथ पेस्ट कर सकते हैं। बस ;)।

मूल रूप से। अब चलिए विशिष्ट प्लेटफॉर्म पर नज़र डालें।

लिनक्स

लिनक्स समर्थन के लिए, छोटे उपयोगिता xclip की जरूरत है, तो आप इसे ubuntu पर sudo के साथ स्थापित कर सकते हैं apt-get इसके अलावा स्थापित xclip, आप चुन सकते हैं, जिसमें से क्लिपबोर्ड आप करना चाहते हैं पेस्ट करें (डिफ़ॉल्ट प्राथमिक क्लिपबोर्ड है)। क्लिपबोर्ड :: क्लिपबोर्ड में सभी क्लिपबोर्ड पर प्रतियां कॉपी करें। उदाहरण के लिए: क्लिपबोर्ड।पेस्ट: प्राथमिक

मैक ओएस

मैक ओएस पर

ठीक काम करता है

29

This answer OSX के लिए महान काम करता है:

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

def pbpaste 
`pbpaste` 
end 
+0

विंडोज़ पर क्लिपबोर्ड पर कॉपी करने के लिए 'pbcopy' के बजाय 'क्लिप' का उपयोग करना – Michiel

0

लगता है आप विंडोज उपयोग कर रहे हैं, इस रूबी के साथ काम करता 1.9.3 विंडोज 7 के तहत।

मूल के लिए nswer, 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 
कोशिश

यदि आपको मणि इंस्टॉल करने की कोई बात नहीं है, तो यह एक बहुत ही सरल समाधान है, विंडोज 7 64 बिट, रूबी 1.9.3 पर काम करता है।

#gem install clipboard 
require 'clipboard' 

Clipboard.copy("This is a sentence that has been copied to your clipboard") 
puts Clipboard.paste 
0

उन लेखन जीटीके + अनुप्रयोगों (जो ओ पी नहीं है), क्लिपबोर्ड लिखने के लिए काफी स्पष्ट है:

Gtk::Clipboard.get(Gdk::Selection::CLIPBOARD).set_text(content).store 

तुम भी प्राथमिक (Gdk::Selection::PRIMARY) या माध्यमिक उपयोग कर सकते हैं (Gdk::Selection::SECONDARY) एक्स चयन।

पूर्ण ruby API और इसके अंतर्निहित C API देखें।