剪贴板类:Windows.ApplicationModel.DataTransfer.ClipBoard

剪贴板有两个事件,都是静态方法:

  • 剪贴板内容改变事件:Clipboard.ContentChanged
  • 剪贴板历史改变事件:Clipboard.HistoryChanged
    但,历史改变事件无法监听文件复制操作

内容改变事件

具体操作代码如下:

//添加事件
Clipboard.ContentChanged += Clipboard_ContentChanged;
private void Clipboard_ContentChanged(object sender, object e)
{
    Debug.WriteLine("ContentChanged");
    if (Clipboard.GetContent().Contains(StandardDataFormats.ApplicationLink))
    {
        Debug.WriteLine("exists: ApplicationLink");
    }
    else if (Clipboard.GetContent().Contains(StandardDataFormats.Bitmap))
    {
        Debug.WriteLine("exists: Bitmap");
    }
    else if (Clipboard.GetContent().Contains(StandardDataFormats.Html))
    {
        Debug.WriteLine("exists: Html");
    }
    else if (Clipboard.GetContent().Contains(StandardDataFormats.Rtf))
    {
        Debug.WriteLine("exists: Rtf");
    }
    else if (Clipboard.GetContent().Contains(StandardDataFormats.StorageItems))
    {
        Debug.WriteLine("exists: StorageItems");
    }
    else if (Clipboard.GetContent().Contains(StandardDataFormats.Text))
    {
        Debug.WriteLine("exists: Text");
    }
    else if (Clipboard.GetContent().Contains(StandardDataFormats.Uri))
    {
        Debug.WriteLine("exists: Uri");
    }
    else if (Clipboard.GetContent().Contains(StandardDataFormats.UserActivityJsonArray))
    {
        Debug.WriteLine("exists: UserActivityJsonArray");
    }
    else if (Clipboard.GetContent().Contains(StandardDataFormats.WebLink))
    {
        Debug.WriteLine("exists: WebLink");
    }
}

获取文件列表

StorageItems 就是存储的文件的内容了,如果要具体获得复制的文件的路径可以这样写:
Clipboard.GetContent()DataPackageView 类型的,可以从这里

private async static void FileCopied(DataPackageView content)
{
    var filelist = await content.GetStorageItemsAsync();
    foreach (IStorageItem item in filelist)
    {
        if (item.IsOfType(StorageItemTypes.File))
        {
            StorageFile file = item as StorageFile;
            Debug.WriteLine(file.Path + " " + file.Name);
        }
        else if (item.IsOfType(StorageItemTypes.Folder))
        {
            Debug.WriteLine("是文件夹");
        }
    }
}

图片操作

对于图片操作如下:

private async static void BitmapCopied(DataPackageView content)
{
    RandomAccessStreamReference file = await content.GetBitmapAsync();
    IRandomAccessStream stream = await file.OpenReadAsync();
    //直接显示图片
    //BitmapImage image = new BitmapImage();
    //await image.SetSourceAsync(stream);
    //Image img = new Image();
    //img.Source = image;
    //转为字节数组
    byte[] bytes = StreamToBytes(stream.AsStream());
    Debug.WriteLine(bytes.Length);
}
public static byte[] StreamToBytes(Stream stream)
{
    byte[] buffer = null;
    try
    {
        if (stream != null && stream.Length > 0)
        {
            //很重要,因为Position经常位于Stream的末尾,导致下面读取到的长度为0。   
            stream.Position = 0;
            using (BinaryReader br = new BinaryReader(stream))
            {
                buffer = br.ReadBytes((int)stream.Length);
            }
        }
    }
    catch (Exception ex)
    {
        Debug.WriteLine(ex.Message);
    }
    return buffer;
}

如果要把图片保存下来可以参考这个

if (con.Contains(StandardDataFormats.Bitmap))
{
   RandomAccessStreamReference img = await con.GetBitmapAsync();
   var imgstream = await img.OpenReadAsync();
   BitmapImage bitmap = new BitmapImage();
   bitmap.SetSource(imgstream);

   Windows.UI.Xaml.Media.Imaging.WriteableBitmap src = new Windows.UI.Xaml.Media.Imaging.WriteableBitmap(bitmap.PixelWidth, bitmap.PixelHeight);
   src.SetSource(imgstream);

   Windows.Graphics.Imaging.BitmapDecoder decoder = await Windows.Graphics.Imaging.BitmapDecoder.CreateAsync(imgstream);
   Windows.Graphics.Imaging.PixelDataProvider pxprd = await decoder.GetPixelDataAsync(Windows.Graphics.Imaging.BitmapPixelFormat.Bgra8, Windows.Graphics.Imaging.BitmapAlphaMode.Straight, new Windows.Graphics.Imaging.BitmapTransform(), Windows.Graphics.Imaging.ExifOrientationMode.RespectExifOrientation, Windows.Graphics.Imaging.ColorManagementMode.DoNotColorManage);
    byte[] buffer = pxprd.DetachPixelData();

    str = "image";
    StorageFolder folder = await _folder.GetFolderAsync(str);

    StorageFile file = await folder.CreateFileAsync(DateTime.Now.Year.ToString() + DateTime.Now.Month.ToString() + DateTime.Now.Day.ToString() + DateTime.Now.Hour.ToString() + DateTime.Now.Minute.ToString() + ".png", CreationCollisionOption.GenerateUniqueName);

     using (var fileStream = await file.OpenAsync(FileAccessMode.ReadWrite))
     {
         var encoder = await Windows.Graphics.Imaging.BitmapEncoder.CreateAsync(Windows.Graphics.Imaging.BitmapEncoder.PngEncoderId, fileStream);
         encoder.SetPixelData(Windows.Graphics.Imaging.BitmapPixelFormat.Bgra8, Windows.Graphics.Imaging.BitmapAlphaMode.Straight, decoder.PixelWidth, decoder.PixelHeight, decoder.DpiX, decoder.DpiY, buffer);
         await encoder.FlushAsync();
      }
}