2009-09-03 18 views
5

के साथ अजीबता मैं कुछ छोटे कार्यक्षमता लिखने की कोशिश कर रहा हूं जिसे कुछ कार्यक्षमता के लिए क्लिपबोर्ड का उपयोग करने की आवश्यकता है। चूंकि मैं वर्तमान में क्लिपबोर्ड में उपयोगकर्ता के डेटा को ओवरराइट नहीं करना चाहता हूं, इसलिए मैंने इसे स्मृति में सहेजने का फैसला किया, अपना काम किया और फिर इसे वापस लिखें। नीचे दिया गया कोड एक कंसोल एप्लिकेशन है जो कि मैं जो करने की कोशिश कर रहा हूं उसका एक बेरबोन उदाहरण है।क्लिपबोर्ड एक्सेस

मेरी समस्या यह है कि मैं राज्य को बहाल कर रहा हूं। यदि मैं एप्लिकेशन चलाने से पहले विजुअल स्टूडियो से क्लिपबोर्ड पर कुछ कॉपी करता हूं तो क्लिपबोर्ड (विभिन्न स्ट्रिंग प्रारूपों और लोकेल) में कुल छह ऑब्जेक्ट्स हैं जो सभी को कैश में डाल दिया जाता है। एक बार जब मैं उन्हें पुनर्स्थापित करता हूं, हालांकि केवल लोकेल क्लिपबोर्ड में होता है और ऐसा लगता है कि SetData() को प्रत्येक कॉल अंतिम पर ओवरराइट करता है। (जिस तरह से SetDataObject GetDataObject के विपरीत प्रतीत नहीं होता है, इसलिए मैं इसका उपयोग नहीं कर सकता)

कोई विचार है कि मैं क्लिपबोर्ड स्थिति कैसे संग्रहीत कर सकता हूं और बाद में इसे पुनर्स्थापित कर सकता हूं?

[STAThread] 
    static void Main(string[] args) 
    { 
     //Store the old clipboard data 
     Dictionary<string, object> clipboardCache = new Dictionary<string, object>(); 

     IDataObject clipboardData = Clipboard.GetDataObject(); 

     foreach (string format in clipboardData.GetFormats()) 
     { 
      clipboardCache.Add(format, clipboardData.GetData(format)); 
     } 

     Clipboard.SetText("Hello world!"); 

     string value = Clipboard.GetText(); 

     Console.WriteLine(value); 

     //Clear the clipboard again and restore old data 
     Clipboard.Clear(); 

     foreach (KeyValuePair<string, object> valuePair in clipboardCache) 
     { 
      Clipboard.SetData(valuePair.Key, valuePair.Value); 
      Thread.Sleep(100); 
     } 

     Console.ReadLine(); 
    } 
+0

क्या आप क्लिपप्क्स जैसे किसी भी ऑब्जेक्ट क्लिपबोर्ड प्लगइन का उपयोग कर रहे हैं? – TheVillageIdiot

+0

कोड स्निपेट ने वास्तव में मेरी समस्या हल की - पूरी तरह से आपके से अलग - लेकिन Google मुझे यहां ले जाता है, इसलिए मैं यहां विवरण पोस्ट करूंगा: किसी को भी कंसोल ऐप से विंडोज क्लिपबोर्ड तक पहुंचने में परेशानी होने के कारण, अपने "मुख्य को सजाने के लिए सुनिश्चित करें "[STAThread]" विशेषता के साथ विधि! : डी – BrainSlugs83

उत्तर

5

विंडोज क्लिपबोर्ड में एक समय में केवल एक वस्तु है। लेकिन उस ऑब्जेक्ट से कई प्रारूप उपलब्ध हैं (उदा। आरटीएफ, टेक्स्ट, एचटीएमएल)। मुझे लगता है कि आप इसे बहुत जटिल बना रहे हैं और आपका कोड इस तरह कुछ होना चाहिए:

//Store the old clipboard data 
IDataObject clipboardData = Clipboard.GetDataObject(); 

Clipboard.SetText("Hello world!"); 

string value = Clipboard.GetText(); 
Console.WriteLine(value); 

//Clear the clipboard again and restore old data 
Clipboard.Clear(); 
Clipboard.SetDataObject(clipboardData); 

Console.ReadLine(); 
+1

जैसा कि मैंने अपने प्रश्न में कहा था, मैंने नहीं सोचा था कि SetDatObject काम कर रहा था क्योंकि ऐसा लगता है कि यह IDataObject स्वीकार नहीं करता है और क्लिपबोर्ड खाली छोड़ देता है , पर मैं गलत था।डिफ़ॉल्ट रूप से यह केवल तब तक डेटा को क्लिपबोर्ड में रखता है जब तक एप्लिकेशन बाहर निकलता न हो। थोड़ा सा पढ़ने के बाद मैंने पाया कि आपका कोड आपके द्वारा सेटडाटा ऑब्जेक्ट (क्लिपबोर्डडेटा) को SetDataObject (क्लिपबोर्डडेटा, सत्य) के साथ प्रतिस्थापित करता है। धन्यवाद - मैंने सोचा कि सरल होना चाहिए। –

1

मार्टिन मैंने आपके कोड की कोशिश की है। मेरे पास ClipX है जो मेरे सिस्टम पर स्थापित है। जब मैं आपका कोड चलाता हूं तो इसे चलाने के साथ मुझे क्लिपपैक्स के कैश में उतनी सारी चीज़ें मिलती हैं। लेकिन कॉल Clipboard.GetDataObject() केवल नवीनतम वस्तु देता है। क्या होता है कि जब आप इस पाश फोन:

foreach (string format in clipboardData.GetFormats()) 
{ 
    clipboardCache.Add(format, clipboardData.GetData(format)); 
} 

यह ClipX में सभी वस्तु के लिए प्रारूप वापस आती है और

IDataObject clipboardData = Clipboard.GetDataObject(); 
तो वास्तव में

द्वारा डेटा नहीं दिया कन्वर्ट जब आप इस पाश को क्रियान्वित कर रहे हैं

foreach (KeyValuePair<string, object> valuePair in clipboardCache) 
{ 
    Clipboard.SetData(valuePair.Key, valuePair.Value); 
    Thread.Sleep(100); 
} 

आपके पास केवल एक ऑब्जेक्ट है जो क्लिपबोर्ड पर सेट किया जा रहा है।

दूसरी बार जब Clipboard.SetData(format,object) का उपयोग पुराने ऑब्जेक्ट को ओवरराइट करना सामान्य व्यवहार सामान्य नहीं है। यदि आप एकाधिक प्रविष्टि क्लिपबोर्ड प्रकार की चीजें बना रहे हैं तो आपको प्रतिलिपि को कॉपी करने और सिस्टम कॉल को पेस्ट करने और ऑब्जेक्ट को अपने प्रोग्राम की मेमोरी या डिस्क में रखने की आवश्यकता है। आप डिफ़ॉल्ट क्लिपबोर्ड पर भरोसा नहीं कर सकते हैं।

+1

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

+1

बस जोड़ने के लिए - मैंने यह भी सोचा कि आप केवल एक आइटम को क्लिपबोर्ड में स्टोर कर सकते हैं, लेकिन यह आज इसके साथ गड़बड़ करने से है कि आपके पास एक आइटम * प्रति * प्रारूप हो सकता है। मुझे यह भी जानने में दिलचस्पी होगी कि क्या मैं इस बारे में सही नहीं हूं ... –

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