2017-05-26 14 views
5

क्या नेट कोर (प्लेटफॉर्म-अज्ञेयवादी तरीके से) का उपयोग करके क्लिपबोर्ड पर कुछ कॉपी करना संभव है?नेट कोर - क्लिपबोर्ड पर कॉपी करें?

ऐसा लगता है कि Clipboard कक्षा गुम है, और पी/Invoking विंडोज के बाहर एक विकल्प नहीं है।

+0

के लिए चेक निकाल देना चाहिए मैं एक छोटे से उपयोग के मामले यहाँ से संदेह में हूँ। आमतौर पर, .netcore ऐप्स वेब ऐप्स या कंसोल ऐप्स होते हैं।इनमें से कोई भी क्लिपबोर्ड एकीकरण करने का कोई अर्थ नहीं बनाता है (आपका वेब क्लाइंट कॉपी/पेस्ट को संभालने वाला एक होगा, इसलिए आपको ऐसा करने के लिए क्लाइंट-साइड जावास्क्रिप्ट लिखना होगा)। यदि आप यूडब्ल्यूपी ऐप लिख रहे हैं, तो यूडब्लूपी में क्लिपबोर्ड एपीआई होने की संभावना है, लेकिन यह ऐसा कुछ नहीं है जो क्रॉस प्लेटफार्म है। आप वास्तव में "क्लिप" करने की कोशिश कर रहे हैं? –

+1

एक मंच अज्ञेय तरीके से - नहीं। आप निश्चित रूप से विभिन्न प्लेटफार्म-विशिष्ट तरीकों से ऐसा कर सकते हैं, और उन्हें सभी को पी/इनकोकिंग की आवश्यकता नहीं है। लिनक्स पर 'xsel', मैक पर' pbcopy'/'pbpaste', विंडोज़ पर 'clip.exe' सभी मानक I/O का उपयोग करके सरल पाठ को अंदर/बाहर करने की अनुमति देते हैं। मैं सभी .NET कोर प्लेटफार्मों के लिए एक वर्किंग 'क्लिपबोर्ड' कक्षा का अनुमान लगा रहा हूं, सबसे प्राथमिकता सूचियों पर अधिक नहीं है। सरल टेक्स्ट से अधिक के लिए अकेले रहने दें, क्योंकि यह अत्यधिक प्लेटफार्म-विशिष्ट हो जाता है। –

+0

@ErikFunkenbusch इस मामले में यह एक कंसोल ऐप और सादा पाठ है। मैं मानता हूं कि एक बेहतर तरीका है, लेकिन इस प्रश्न के लिए मैं केवल –

उत्तर

9

क्लिपबोर्ड कक्षा गुम है, उम्मीद है कि निकट भविष्य में इसके लिए एक विकल्प जोड़ा जाएगा। हालांकि ऐसा होता है ... आप ProcessStartInfo के साथ एक देशी खोल कमांड चला सकते हैं।

मैं नेट कोर में noob हूँ, लेकिन विंडोज और मैक पर क्लिपबोर्ड में भेजने के लिए इस कोड और स्ट्रिंग बनाने के लिए:

ओएस जांच कक्षा

public static class OperatingSystem 
{ 
    public static bool IsWindows() => 
     RuntimeInformation.IsOSPlatform(OSPlatform.Windows); 

    public static bool IsMacOS() => 
     RuntimeInformation.IsOSPlatform(OSPlatform.OSX); 

    public static bool IsLinux() => 
     RuntimeInformation.IsOSPlatform(OSPlatform.Linux); 
} 

शैल कक्षा
आधारित https://loune.net/2017/06/running-shell-bash-commands-in-net-core/

public static class Shell 
{ 
    public static string Bash(this string cmd) 
    { 
     var escapedArgs = cmd.Replace("\"", "\\\""); 
     string result = Run("/bin/bash", $"-c \"{escapedArgs}\""); 
     return result; 
    } 

    public static string Bat(this string cmd) 
    { 
     var escapedArgs = cmd.Replace("\"", "\\\""); 
     string result = Run("cmd.exe", $"/c \"{escapedArgs}\""); 
     return result; 
    } 

    private static string Run (string filename, string arguments){ 
     var process = new Process() 
     { 
      StartInfo = new ProcessStartInfo 
      { 
       FileName = filename, 
       Arguments = arguments, 
       RedirectStandardOutput = true, 
       UseShellExecute = false, 
       CreateNoWindow = false, 
      } 
     }; 
     process.Start(); 
     string result = process.StandardOutput.ReadToEnd(); 
     process.WaitForExit(); 
     return result; 
    } 
} 

क्लिपबोर्ड कक्षा

public static class Clipboard 
{ 
    public static void Copy(string val) 
    { 
     if (OperatingSystem.IsWindows()) 
     { 
      $"echo {val} | clip".Bat(); 
     } 

     if (OperatingSystem.IsMacOS()) 
     { 
      $"echo \"{val}\" | pbcopy".Bash(); 
     } 
    } 
} 

फिर अंत में, आप क्लिपबोर्ड कॉपी कॉल कर सकते हैं और क्लिपबोर्ड पर मूल्य मिल सकता है।

var dirPath = @"C:\MyPath"; 
Clipboard.Copy(dirPath); 

आशा है कि यह दूसरों की मदद करे! सुधार स्वागत है।

मैं इन सभी चीजों के साथ .net कोर के लिए टूलबॉक्स लाइब्रेरी में काम कर रहा हूं: https://github.com/deinsoftware/toolbox (NuGet पैकेज के रूप में भी उपलब्ध)।

+0

मुझे वास्तव में यह सामान्य समाधान पसंद है। Cmd.exe एक निश्चित आकार से पहले डेटा स्वीकार नहीं करने के कारण, यह बहुत बड़े टेक्स्ट स्निपेट के लिए काम नहीं कर रहा है। विंडोज क्लिपबोर्ड पर कुछ पाने के लिए किसी अन्य विचार पर कोई विचार? –

1

के बाद से मैं अभी तक हूं नहीं कर सकते, मुझे ऐसा जवाब, रूप में पोस्ट करें, लेकिन वास्तव में यह सिर्फ Equiman के समाधान की एक वृद्धि है:

महान, लेकिन बहु-लाइन के लिए ग्रंथों उनका समाधान काम करता है

यह एक संशोधित कॉपी विधि और एक अस्थायी फ़ाइल के साथ काम करता पाठ के सभी लाइनों धारण करने के लिए:

public static void Copy(string val) 
{ 
    string[] lines = val.Split('\n'); 
    if (lines.Length == 0) 
     $"echo {val} | clip".Bat(); 
    else 
    { 
     StringBuilder output = new StringBuilder(); 

     foreach(string line in lines) 
     { 
      string text = line.Trim(); 
      if (!string.IsNullOrWhiteSpace(text)) 
      { 
       output.AppendLine(text); 
      } 
     } 

     string tempFile = @"D:\tempClipboard.txt"; 

     File.WriteAllText(tempFile, output.ToString()); 
     $"type { tempFile } | clip".Bat(); 

    } 
} 

नोट: यदि आप, कोड मेरी उदाहरण की तरह एक निश्चित अस्थायी फ़ाइल का उपयोग नहीं करने के लिए बढ़ाने या पथ को संशोधित करने के लिए चाहते हो सकता ।

यह समाधान विंडोज के लिए काम करता है, लेकिन मैक/लिनक्स इत्यादि के बारे में निश्चित नहीं है, लेकिन सिद्धांत अन्य प्रणालियों पर भी लागू होना चाहिए। जहां तक ​​मुझे याद है, आपको लिनक्स में "बिल्ली" के साथ "प्रकार" को प्रतिस्थापित करने की आवश्यकता हो सकती है।

चूंकि मेरे समाधान को केवल विंडोज़ पर चलाने की आवश्यकता है, इसलिए मैंने आगे की जांच नहीं की।

यदि आप विंडोज के लिए उपरोक्त कोड का उपयोग करते हैं, तो अस्थायी फ़ाइल के पथ में रिक्त स्थान नहीं होना चाहिए!

आप क्लिपबोर्ड कॉपी में खाली लाइन्स रखने के लिए और साथ ही चाहते हैं, आप "string.IsNullOrWhiteSpace"

संबंधित मुद्दे