WPF剪贴板浏览

WPF剪贴板浏览
在这里插入图片描述
前台代码

<Window x:Class="ClipboardViewer.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ClipboardViewer"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525" Loaded="WindowLoaded">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
            <ColumnDefinition Width="5" Name="dividerColumn" />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>

        <Border>
            <StackPanel>
                <Button
          Content="Clear Clipboard"
          Click="ClearClipboard"
          Margin="2"/>

                <Separator/>

                <Label>Current Clipboard Format:</Label>

                <StackPanel
          Orientation="Horizontal"
        >
                    <CheckBox
            Name="cbAudio"
            IsEnabled="False"
            IsChecked="False"
            VerticalAlignment="Center"
            VerticalContentAlignment="Center"
            Margin="2"
            Padding="0,0,0,0"
          />
                    <Label>Audio</Label>
                </StackPanel>

                <StackPanel
          Orientation="Horizontal"
        >
                    <CheckBox
            Name="cbFileDropList"
            IsEnabled="False"
            IsChecked="False"
            VerticalAlignment="Center"
            VerticalContentAlignment="Center"
            Margin="2"
            Padding="0,0,0,0"
          />
                    <Label>FileDropList</Label>
                </StackPanel>

                <StackPanel
          Orientation="Horizontal"
        >
                    <CheckBox
            Name="cbImage"
            IsEnabled="False"
            IsChecked="False"
            VerticalAlignment="Center"
            VerticalContentAlignment="Center"
            Margin="2"
            Padding="0,0,0,0"
          />
                    <Label>Image</Label>
                </StackPanel>

                <StackPanel
          Orientation="Horizontal"
        >
                    <CheckBox
            Name="cbText"
            IsEnabled="False"
            IsChecked="False"
            VerticalAlignment="Center"
            VerticalContentAlignment="Center"
            Margin="2"
            Padding="0,0,0,0"
          />
                    <Label>Text</Label>
                </StackPanel>

                <StackPanel
          Orientation="Horizontal"
        >
                    <CheckBox
            Name="cbRtf"
            IsEnabled="False"
            IsChecked="False"
            VerticalAlignment="Center"
            VerticalContentAlignment="Center"
            Margin="2"
            Padding="0,0,0,0"
          />
                    <Label>RTF</Label>
                </StackPanel>

                <StackPanel
          Orientation="Horizontal"
        >
                    <CheckBox
            Name="cbXaml"
            IsEnabled="False"
            IsChecked="False"
            VerticalAlignment="Center"
            VerticalContentAlignment="Center"
            Margin="2"
            Padding="0,0,0,0"
          />
                    <Label>Xaml</Label>
                </StackPanel>

                <Button
          Content="Refresh"
          Click="RefreshClipboardDataFormatStatus"
          Margin="2"
        />

                <Separator/>

                <Button
          Content="Dump All Clipboard Contents"
          Click="DumpAllClipboardContents"
          Margin="2"
        />

                <Separator/>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition />
                    </Grid.ColumnDefinitions>

                    <Border 
            Grid.Column="0"
            BorderBrush="Black"
            BorderThickness="1"
            Margin="2"
          >
                        <StackPanel>
                            <Label>Copy(Set) Format:</Label>

                            <StackPanel
                Orientation="Horizontal"
              >
                                <CheckBox
                  Name="cbCopyRtfDataFormat"
                  VerticalAlignment="Center"
                  VerticalContentAlignment="Center"
                  Margin="2"
                  Padding="0,0,0,0"
                />
                                <Label>Rich Text Format</Label>
                            </StackPanel>

                            <StackPanel
                Orientation="Horizontal"
              >
                                <CheckBox
                  Name="cbCopyTextDataFormat"
                  IsChecked="True"            
                  VerticalAlignment="Center"
                  VerticalContentAlignment="Center"
                  Margin="2"
                  Padding="0,0,0,0"
                />
                                <Label>Text</Label>
                            </StackPanel>

                            <StackPanel
                Orientation="Horizontal"
              >
                                <CheckBox
                  Name="cbCopyXamlDataFormat"
                  VerticalAlignment="Center"
                  VerticalContentAlignment="Center"
                  Margin="2"
                  Padding="0,0,0,0"
                />
                                <Label>Xaml</Label>
                            </StackPanel>

                            <StackPanel
                Orientation="Horizontal"
              >
                                <CheckBox
                  Name="cbCustomSampleDataFormat"
                  VerticalAlignment="Center"
                  VerticalContentAlignment="Center"
                  Margin="2"
                  Padding="0,0,0,0"
                />
                                <Label>CustomSample</Label>
                            </StackPanel>

                            <Button
                Content="Copy To Clipboard"
                Click="CopyToClipboard"
                Margin="2"
              />

                            <Separator/>

                            <StackPanel>
                                <Label >Copy Data From:</Label>
                                <RadioButton 
                    Name="rbCopyDataFromRichTextBox" 
                    Margin="2" 
                    GroupName="CopyDataFrom" 
                    IsChecked="True"
                >RichTextBox</RadioButton>
                                <RadioButton 
                    Name="rbCopyDataFromFile" 
                    Margin="2" 
                    GroupName="CopyDataFrom"
                >File</RadioButton>

                            </StackPanel>

                            <Separator/>

                            <StackPanel
                Orientation="Horizontal"
              >
                                <CheckBox
                  Name="cbFlushOnCopy"
                  VerticalAlignment="Center"
                  VerticalContentAlignment="Center"
                  Margin="2"
                  Padding="0,0,0,0"
                />
                                <Label>Flush On Copy</Label>
                            </StackPanel>

                        </StackPanel>

                    </Border>

                    <Border 
            Grid.Column="1"
            BorderBrush="Black"
            BorderThickness="1"
            Margin="2"
          >
                        <StackPanel>
                            <Label>Paste(Get) Format:</Label>
                            <ListBox
                Name="lbPasteDataFormat" 
                Height="90"
                Margin="2"
              />

                            <Button
                Content="Paste From Clipboard"
                Click="PasteFromClipboard"
                Margin="2"
              />

                            <Separator/>

                            <StackPanel>
                                <Label >Paste Data To:</Label>
                                <RadioButton 
                    Name="rbPasteDataToRichTextBox"
                    Margin="2" 
                    GroupName="PasteDataTo" 
                    IsChecked="True"
                >RichTextBox</RadioButton>
                                <RadioButton 
                    Name="rbPasteDataToFile"
                    Margin="2" 
                    GroupName="PasteDataTo"
                >File</RadioButton>
                            </StackPanel>

                            <Separator/>

                            <StackPanel
                Orientation="Horizontal"
              >
                                <CheckBox
                  Name="cbAutoConvertibleData"
                  IsChecked="True" 
                  VerticalAlignment="Center"
                  VerticalContentAlignment="Center"
                  Margin="2"
                  Padding="0,0,0,0"
                />
                                <Label>AutoConvert</Label>
                            </StackPanel>

                        </StackPanel>
                    </Border>
                </Grid>

            </StackPanel>

        </Border>


        <GridSplitter
        Name="splitter"
        Grid.Column="1"
        ResizeDirection="Columns"
        ResizeBehavior="PreviousAndNext"
        HorizontalAlignment="Stretch" 
      />


        <Border 
        Grid.Column="2"
        BorderBrush="Black"
        BorderThickness="1"
      >

            <Grid>

                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition/>
                    <RowDefinition Height="150"/>
                </Grid.RowDefinitions>
                <Label Grid.Row="0">Clipboard Status Information:</Label>

                <TextBox
            Name="clipboardInfo" 
            IsReadOnly="True"
            AcceptsReturn="True"
            VerticalScrollBarVisibility="Auto"
            HorizontalScrollBarVisibility="Auto"
            Grid.Row="1"  
          />

                <Border 
            Grid.Row="2" 
            BorderBrush="Black"
            BorderThickness="1"
          >
                    <StackPanel>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Margin="5">Copy/Paste Clipboard Data From/To RichTextBox:</TextBlock>
                            <Button
                Content="Clear RichTextBox"
                Click="ClearRichTextBox"
                Margin="2"
              />
                        </StackPanel>

                        <RichTextBox
            Name="richTextBox" 
            VerticalScrollBarVisibility="Auto"
            HorizontalScrollBarVisibility="Auto"
            Height="100"
            Margin="3"
            BorderThickness="2"
          />
                    </StackPanel>
                </Border>

            </Grid>
        </Border>

    </Grid>
</Window>

后台代码

using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows;
using System.Windows.Documents;
using Microsoft.Win32;

namespace ClipboardViewer
{
    /// <summary>
    ///     Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        // This is called when UI is laid out, rendered and ready for interaction.
        private void WindowLoaded(object sender, RoutedEventArgs args)
        {
            // Check the current Clipboard data format status
            RefreshClipboardDataFormat();

            // Set the text copy information on RichTextBox
            SetTextOnRichTextBox("Please type clipboard copy data here!");
        }

        private void ClearClipboard(object sender, RoutedEventArgs args)
        {
            // Clear Clipboard
            Clipboard.Clear();

            // Update the current Clipboard data format status after clear Clipboard
            RefreshClipboardDataFormat();
        }

        private void RefreshClipboardDataFormatStatus(object sender, RoutedEventArgs args)
        {
            // Refresh the all clipboard data format into the information panel
            RefreshClipboardDataFormat();
        }

        private void DumpAllClipboardContents(object sender, RoutedEventArgs args)
        {
            // Dump all Clipboard contents on the Clipboard information panel
            DumpAllClipboardContentsInternal();
        }

        private void CopyToClipboard(object sender, RoutedEventArgs args)
        {
            var dataObject = new DataObject();

            // Copy data from RichTextBox/File content into DataObject
            if ((bool) rbCopyDataFromRichTextBox.IsChecked)
            {
                CopyDataFromRichTextBox(dataObject);
            }
            else
            {
                CopyDataFromFile(dataObject);
            }

            // Copy DataObject on the system Clipboard
            if (dataObject.GetFormats().Length > 0)
            {
                if ((bool) cbFlushOnCopy.IsChecked)
                {
                    // Copy data to the system clipboard with flush
                    Clipboard.SetDataObject(dataObject, true /*copy*/);
                }
                else
                {
                    // Copy data to the system clipboard without flush
                    Clipboard.SetDataObject(dataObject, false /*copy*/);
                }
            }

            // Dump the copied data contents on the information panel
            DumpAllClipboardContentsInternal();
        }

        private void PasteFromClipboard(object sender, RoutedEventArgs args)
        {
            var dataObject = GetDataObjectFromClipboard();

            if (dataObject == null)
            {
                MessageBox.Show("Couldn't get DataObject from system clipboard!\n", "Clipboard Error");
                return;
            }

            var autoConvert = (bool) cbAutoConvertibleData.IsChecked;
            var pasteDataFormat = lbPasteDataFormat.SelectedItems[0] as string;

            if ((bool) rbPasteDataToRichTextBox.IsChecked)
            {
                // Paste data from Clipboard to RichTextBox
                PasteClipboardDataToRichTextBox(pasteDataFormat, dataObject, autoConvert);
            }
            else
            {
                // Paste data from Clipboard to File
                PasteClipboardDataToFile(pasteDataFormat, dataObject, autoConvert);
            }
        }

        private void ClearRichTextBox(object sender, RoutedEventArgs args)
        {
            SetTextOnRichTextBox("");
        }

        // Update the data format status and describe all available data formats
        private void RefreshClipboardDataFormat()
        {
            clipboardInfo.Clear();

            lbPasteDataFormat.Items.Clear();

            var dataObject = GetDataObjectFromClipboard();

            if (dataObject == null)
            {
                clipboardInfo.Text = "Can't access clipboard now! Please click Refresh button again.";
            }
            else
            {
                // Check the data format whether it is on Clipboard or not
                cbAudio.IsChecked = dataObject.GetDataPresent(DataFormats.WaveAudio);
                cbFileDropList.IsChecked = dataObject.GetDataPresent(DataFormats.FileDrop);
                cbImage.IsChecked = dataObject.GetDataPresent(DataFormats.Bitmap);
                cbText.IsChecked = dataObject.GetDataPresent(DataFormats.Text);
                cbRtf.IsChecked = dataObject.GetDataPresent(DataFormats.Rtf);
                cbXaml.IsChecked = dataObject.GetDataPresent(DataFormats.Xaml);

                // Update the data format into the information panel
                UpdateAvailableDataFormats(dataObject);
            }
        }

        // Update and describe all available data formats
        private void UpdateAvailableDataFormats(IDataObject dataObject)
        {
            clipboardInfo.AppendText("Clipboard DataObject Type: ");
            clipboardInfo.AppendText(dataObject.GetType().ToString());

            clipboardInfo.AppendText("\n\n****************************************************\n\n");

            var formats = dataObject.GetFormats();

            clipboardInfo.AppendText(
                "The following data formats are present in the data object obtained from the clipboard:\n");

            if (formats.Length > 0)
            {
                foreach (var format in formats)
                {
                    bool nativeData;
                    if (dataObject.GetDataPresent(format, false))
                    {
                        nativeData = true;
                        clipboardInfo.AppendText("\t- " + format + " (native)\n");
                    }
                    else
                    {
                        nativeData = false;
                        clipboardInfo.AppendText("\t- " + format + " (autoconvertable)\n");
                    }

                    if (nativeData)
                    {
                        lbPasteDataFormat.Items.Add(format);
                    }
                    else if ((bool) cbAutoConvertibleData.IsChecked)
                    {
                        lbPasteDataFormat.Items.Add(format);
                    }
                }

                lbPasteDataFormat.SelectedIndex = 0;
            }
            else
            {
                clipboardInfo.AppendText("\t- no data formats are present\n");
            }
        }

        // Dump all available data contents
        private void DumpAllClipboardContentsInternal()
        {
            clipboardInfo.Clear();

            lbPasteDataFormat.Items.Clear();

            var dataObject = GetDataObjectFromClipboard();

            if (dataObject == null)
            {
                clipboardInfo.Text =
                    clipboardInfo.Text =
                        "Can't access clipboard now! \n\nPlease click Dump All Clipboard Contents button again.";
            }
            else
            {
                // Update the availabe data formats 
                UpdateAvailableDataFormats(dataObject);

                // Update the all available data contents
                var formats = dataObject.GetFormats();
                foreach (var format in formats)
                {
                    clipboardInfo.AppendText("\n\n****************************************************\n");
                    clipboardInfo.AppendText(format + " data:\n");
                    clipboardInfo.AppendText("****************************************************\n\n");

                    var data = GetDataFromDataObject(dataObject, format, true /*autoConvert*/);

                    clipboardInfo.AppendText(data?.ToString() ?? "null");
                }
            }
        }

        // Set the selected data format's data from RichTextBox's content 
        // into DataObject for copying data on the system clipboard
        private void CopyDataFromRichTextBox(IDataObject dataObject)
        {
            if ((bool) cbCopyTextDataFormat.IsChecked)
            {
                var textData = GetTextStringFromRichTextBox(DataFormats.Text);
                if (textData != string.Empty)
                {
                    dataObject.SetData(DataFormats.Text, textData);
                }
            }

            if ((bool) cbCopyXamlDataFormat.IsChecked)
            {
                var textData = GetTextStringFromRichTextBox(DataFormats.Xaml);
                if (textData != string.Empty)
                {
                    dataObject.SetData(DataFormats.Xaml, textData);
                }
            }

            if ((bool) cbCopyRtfDataFormat.IsChecked)
            {
                var textData = GetTextStringFromRichTextBox(DataFormats.Rtf);
                if (textData != string.Empty)
                {
                    dataObject.SetData(DataFormats.Rtf, textData);
                }
            }

            // Finally, consider a custom, application defined format.
            // We use an arbitrary encoding here, for demonstration purposes.
            if ((bool) cbCustomSampleDataFormat.IsChecked)
            {
                Stream customStream = new MemoryStream();

                var textData = "This is Custom Sample Data Start\n\n" +
                               GetTextStringFromRichTextBox(DataFormats.Text) +
                               "\nCustom Sample Data End.";

                var bytesUnicode = Encoding.Unicode.GetBytes(textData);
                var bytes = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, bytesUnicode);

                if (bytes.Length > 0)
                {
                    customStream.Write(bytes, 0, bytes.Length);
                    dataObject.SetData("CustomSample", customStream);
                }
            }
        }

        // Set the selected data format's data from the file content 
        // into DataObject for copying data on the system clipboard
        private void CopyDataFromFile(IDataObject dataObject)
        {
            string fileName = null;

            var dialog = new OpenFileDialog {CheckFileExists = true};

            if ((bool) cbCopyTextDataFormat.IsChecked)
            {
                dialog.Filter = "Plain Text (*.txt)|*.txt";
                dialog.ShowDialog();
                fileName = dialog.FileName;

                if (string.IsNullOrEmpty(fileName))
                {
                    return;
                }

                var fileEncoding = Encoding.Default;
                var textData = GetTextStringFromFile(fileName, fileEncoding);
                if (!string.IsNullOrEmpty(textData))
                {
                    dataObject.SetData(DataFormats.Text, textData);
                }
            }

            if ((bool) cbCopyRtfDataFormat.IsChecked)
            {
                fileName = null;
                dialog.Filter = "RTF Documents (*.rtf)|*.rtf";
                dialog.ShowDialog();
                fileName = dialog.FileName;

                if (string.IsNullOrEmpty(fileName))
                {
                    return;
                }

                var fileEncoding = Encoding.ASCII;
                var textData = GetTextStringFromFile(fileName, fileEncoding);
                if (!string.IsNullOrEmpty(textData))
                {
                    dataObject.SetData(DataFormats.Rtf, textData);
                }
            }

            if ((bool) cbCopyXamlDataFormat.IsChecked)
            {
                fileName = null;
                dialog.Filter = "XAML Flow Documents (*.xaml)|*.xaml";
                dialog.ShowDialog();
                fileName = dialog.FileName;

                if (string.IsNullOrEmpty(fileName))
                {
                    return;
                }

                var fileEncoding = Encoding.UTF8;
                var textData = GetTextStringFromFile(fileName, fileEncoding);
                if (!string.IsNullOrEmpty(textData))
                {
                    dataObject.SetData(DataFormats.Xaml, textData);
                }
            }

            // Finally, consider a custom, application defined format.
            // We use an arbitrary encoding here, for demonstartion purposes.
            if ((bool) cbCustomSampleDataFormat.IsChecked)
            {
                fileName = null;
                dialog.Filter = "All Files (*.*)|*.*";
                dialog.ShowDialog();
                fileName = dialog.FileName;

                if (string.IsNullOrEmpty(fileName))
                {
                    return;
                }

                var fileEncoding = Encoding.UTF8;
                var textData = GetTextStringFromFile(fileName, fileEncoding);
                if (string.IsNullOrEmpty(textData)) return;
                var bytesUnicode = Encoding.Unicode.GetBytes(textData);
                var bytes = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, bytesUnicode);

                if (bytes.Length > 0)
                {
                    var customStream = new MemoryStream();
                    customStream.Write(bytes, 0, bytes.Length);
                    dataObject.SetData("CustomSample", customStream);
                }
            }
        }

        // Paste a selected paste data format's data to RichTextBox
        private void PasteClipboardDataToRichTextBox(string dataFormat, IDataObject dataObject, bool autoConvert)
        {
            if (dataObject != null && dataObject.GetFormats().Length > 0)
            {
                var pasted = false;

                if (dataFormat == DataFormats.Xaml)
                {
                    var xamlData = dataObject.GetData(DataFormats.Xaml) as string;
                    if (!string.IsNullOrEmpty(xamlData))
                    {
                        pasted = PasteTextDataToRichTextBox(DataFormats.Xaml, xamlData);
                    }
                }
                else if (dataFormat == DataFormats.Rtf)
                {
                    var rtfData = dataObject.GetData(DataFormats.Rtf) as string;
                    if (!string.IsNullOrEmpty(rtfData))
                    {
                        pasted = PasteTextDataToRichTextBox(DataFormats.Rtf, rtfData);
                    }
                }
                else if (dataFormat == DataFormats.UnicodeText
                         || dataFormat == DataFormats.Text
                         || dataFormat == DataFormats.StringFormat)
                {
                    var textData = dataObject.GetData(dataFormat) as string;
                    if (textData != string.Empty)
                    {
                        SetTextOnRichTextBox(textData);
                        pasted = true;
                    }
                }
                else if (dataFormat == "CustomSample")
                {
                    // Paste the application defined custom data format's data to RichTextBox content
                    var customStream = dataObject.GetData(dataFormat, autoConvert) as Stream;
                    if (customStream.Length > 0)
                    {
                        var textRange = new TextRange(richTextBox.Document.ContentStart,
                            richTextBox.Document.ContentEnd);
                        textRange.Load(customStream, DataFormats.Text);
                        pasted = true;
                    }
                }

                if (!pasted)
                {
                    MessageBox.Show(
                        "Can't paste the selected data format into RichTextBox!\n\nPlease click Refresh button to update the current clipboard format Or select File RadioButton to paste data.",
                        "Paste Data Format Error",
                        MessageBoxButton.OK,
                        MessageBoxImage.Exclamation);
                }
            }
        }

        // Paste a selected paste data format's data to the fileSSS
        private void PasteClipboardDataToFile(string dataFormat, IDataObject dataObject, bool autoConvert)
        {
            var dialog = new SaveFileDialog {CheckFileExists = false};

            if (dataFormat == DataFormats.Text
                || dataFormat == DataFormats.UnicodeText
                || dataFormat == DataFormats.StringFormat)
            {
                dialog.Filter = "Plain Text (*.txt)|*.txt | All Files (*.*)|*.*";
            }
            else if (dataFormat == DataFormats.Xaml)
            {
                dialog.Filter = "XAML Flow Documents (*.xaml)|*.xaml | All Files (*.*)|*.*";
            }
            else if (dataFormat == DataFormats.Rtf)
            {
                dialog.Filter = "RTF Documents (*.rtf)|*.rtf | All Files (*.*)|*.*";
            }
            else
            {
                dialog.Filter = "All Files (*.*)|*.*";
            }

            if (!(bool) dialog.ShowDialog())
            {
                return;
            }

            var fileName = dialog.FileName;

            if (dataFormat == DataFormats.Xaml)
            {
                var xamlData = dataObject.GetData(DataFormats.Xaml) as string;
                if (!string.IsNullOrEmpty(xamlData))
                {
                    PasteTextDataToFile(dataFormat, xamlData, fileName, Encoding.UTF8);
                }
            }
            else if (dataFormat == DataFormats.Rtf)
            {
                var rtfData = dataObject.GetData(DataFormats.Rtf) as string;
                if (!string.IsNullOrEmpty(rtfData))
                {
                    PasteTextDataToFile(dataFormat, rtfData, fileName, Encoding.ASCII);
                }
            }
            else if (dataFormat == DataFormats.UnicodeText
                     || dataFormat == DataFormats.Text
                     || dataFormat == DataFormats.StringFormat)
            {
                var textData = dataObject.GetData(dataFormat, autoConvert) as string;
                if (!string.IsNullOrEmpty(textData))
                {
                    PasteTextDataToFile(dataFormat, textData, fileName,
                        dataFormat == DataFormats.Text ? Encoding.Default : Encoding.Unicode);
                }
            }
            else
            {
                // Paste the CustomSample data or others to the file
                //Stream customStream = dataObject.GetData(dataFormat, autoConvert) as Stream;
                var customStream = GetDataFromDataObject(dataObject, dataFormat, autoConvert) as Stream;
                if (customStream != null && customStream.Length > 0)
                {
                    PasteStreamDataToFile(customStream, fileName);
                }
            }
        }

        // Get DataObject from the system clipboard
        private IDataObject GetDataObjectFromClipboard()
        {
            IDataObject dataObject;

            try
            {
                dataObject = Clipboard.GetDataObject();
            }
            catch (COMException)
            {
                // Clipboard.GetDataObject can be failed by opening the system clipboard 
                // from other or processing clipboard operation like as setting data on clipboard
                dataObject = null;
            }

            return dataObject;
        }

        private object GetDataFromDataObject(IDataObject dataObject, string dataFormat, bool autoConvert)
        {
            object data = null;

            try
            {
                data = dataObject.GetData(dataFormat, autoConvert);
            }
            catch (COMException)
            {
                // Fail to get the data by the invalid value like tymed(DV_E_TYMED) 
                // or others(Aspect, Formatetc).
                // It depends on application's IDataObject::GetData implementation.
                clipboardInfo.AppendText("Fail to get data!!! ***COMException***");
            }
            catch (OutOfMemoryException)
            {
                // Fail by the out of memory from getting data on Clipboard. 
                // Occurs with the low memory.
                clipboardInfo.AppendText("Fail to get data!!! ***OutOfMemoryException***");
            }

            return data;
        }

        // Set the plain text on RichTextBox
        private void SetTextOnRichTextBox(string text)
        {
            var document = richTextBox.Document;
            var textRange = new TextRange(document.ContentStart, document.ContentEnd) {Text = text};
            richTextBox.Focus();
            richTextBox.SelectAll();
        }

        // Get text data string from RichTextBox content which encoded as UTF8
        private string GetTextStringFromRichTextBox(string dataFormat)
        {
            var document = richTextBox.Document;
            var textRange = new TextRange(document.ContentStart, document.ContentEnd);

            if (dataFormat == DataFormats.Text)
            {
                return textRange.Text;
            }
            Stream contentStream = new MemoryStream();
            textRange.Save(contentStream, dataFormat);

            if (contentStream.Length > 0)
            {
                var bytes = new byte[contentStream.Length];

                contentStream.Position = 0;
                contentStream.Read(bytes, 0, bytes.Length);

                var utf8Encoding = Encoding.UTF8;

                return utf8Encoding.GetString(bytes);
            }

            return null;
        }

        // Get text data string from file content with the proper encoding
        private string GetTextStringFromFile(string fileName, Encoding fileEncoding)
        {
            string textString = null;

            FileStream fileStream;

            try
            {
                fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
            }
            catch (IOException)
            {
                MessageBox.Show("File is not acessible.\n", "File Open Error");
                return null;
            }

            fileStream.Position = 0;

            var bytes = new byte[fileStream.Length];

            fileStream.Read(bytes, 0, bytes.Length);

            if (bytes.Length > 0)
            {
                textString = fileEncoding.GetString(bytes);
            }

            fileStream.Close();

            return textString;
        }

        // Paste text data on RichTextBox as UTF8 encoding
        private bool PasteTextDataToRichTextBox(string dataFormat, string textData)
        {
            var pasted = false;

            var document = richTextBox.Document;
            var textRange = new TextRange(document.ContentStart, document.ContentEnd);

            Stream stream = new MemoryStream();

            var bytesUnicode = Encoding.Unicode.GetBytes(textData);
            var bytes = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, bytesUnicode);

            if (bytes.Length > 0 && textRange.CanLoad(dataFormat))
            {
                stream.Write(bytes, 0, bytes.Length);
                textRange.Load(stream, dataFormat);
                pasted = true;
            }

            return pasted;
        }

        // Paste text data to the file with the file encoding
        private void PasteTextDataToFile(string dataFormat, string textData, string fileName, Encoding fileEncoding)
        {
            FileStream fileWriteStream;

            try
            {
                fileWriteStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write);
            }
            catch (IOException)
            {
                MessageBox.Show("File is not acessible.\n", "File Write Error");
                return;
            }

            fileWriteStream.SetLength(0);

            var bytesUnicode = Encoding.Unicode.GetBytes(textData);
            var bytes = Encoding.Convert(Encoding.Unicode, fileEncoding, bytesUnicode);

            if (bytes.Length > 0)
            {
                fileWriteStream.Write(bytes, 0, bytes.Length);
            }

            fileWriteStream.Close();
        }

        // Paste stream data to the file
        private void PasteStreamDataToFile(Stream stream, string fileName)
        {
            FileStream fileWriteStream = null;

            try
            {
                fileWriteStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write);
            }
            catch (IOException)
            {
                MessageBox.Show("File is not acessible.\n", "File Write Error");
            }

            fileWriteStream.SetLength(0);

            var bytes = new byte[stream.Length];

            stream.Position = 0;
            stream.Read(bytes, 0, bytes.Length);

            if (bytes.Length > 0)
            {
                fileWriteStream.Write(bytes, 0, bytes.Length);
            }

            fileWriteStream.Close();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向着光-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值