[源码下载]

背水一战 Windows 10 (102) - 应用间通信: 剪切板

作者:webabcd

介绍
背水一战 Windows 10 之 应用间通信

  • 剪切板 - 基础, 复制/粘贴 text 内容
  • 剪切板 - 复制/粘贴 html 内容
  • 剪切板 - 复制/粘贴 bitmap 内容,延迟复制
  • 剪切板 - 复制/粘贴文件

示例
1、演示剪切板的基础知识,以及如何复制 text 数据到剪切板,以及如何从剪切板中获取 text 数据 
App2AppCommunication/Clipboard.xaml

<Page
x:Class="Windows10.App2AppCommunication.Clipboard"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Windows10.App2AppCommunication"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <Grid Background="Transparent">
<StackPanel Margin="10 0 10 10"> <TextBlock Name="lblMsg" Margin="5" /> <Button Name="btnCopyText" Content="复制一段文本到剪切板" Click="btnCopyText_Click" Margin="5" /> <Button Name="btnPasteText" Content="粘贴剪切板中的文本" Click="btnPasteText_Click" Margin="5" /> <Button Name="btnShowAvailableFormats" Content="获取剪切板中包含的数据的格式类型" Click="btnShowAvailableFormats_Click" Margin="5" /> <Button Name="btnClear" Content="清除剪切板中的全部内容" Click="btnClear_Click" Margin="5" /> </StackPanel>
</Grid>
</Page>

App2AppCommunication/Clipboard.xaml.cs

/*
* 演示剪切板的基础知识,以及如何复制 text 数据到剪切板,以及如何从剪切板中获取 text 数据
*
* Clipboard - 剪切板
* SetContent() - 将指定的 DataPackage 存入剪切板
* GetContent() - 从剪切板中获取 DataPackage 对象
* Clear() - 清除剪切板中的全部数据
* Flush() - 正常情况下,关闭 app 后,此 app 保存到剪切板的数据就会消失;调用此方法后,即使关闭 app,剪切板中的数据也不会消失
* ContentChanged - 剪切板中的数据发生变化时所触发的事件
*
* DataPackage - 用于封装 Clipboard 或 ShareContract 的数据(详细说明见“分享”的 Demo)
* SetText(), SetWebLink(), SetApplicationLink(), SetHtmlFormat(), SetBitmap(), SetStorageItems(), SetData(), SetDataProvider() - 设置复制到剪切板的各种格式的数据(注:一个 DataPackage 可以有多种不同格式的数据)
* RequestedOperation - 操作类型(DataPackageOperation 枚举: None, Copy, Move, Link),没发现此属性有任何作用
*
* DataPackageView - DataPackage 对象的只读版本,从剪切板获取数据或者共享目标接收数据均通过此对象来获取 DataPackage 对象的数据(详细说明见“分享”的 Demo)
*/ using System;
using Windows.ApplicationModel.DataTransfer;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation; namespace Windows10.App2AppCommunication
{
public sealed partial class Clipboard : Page
{
public Clipboard()
{
this.InitializeComponent();
} protected override void OnNavigatedTo(NavigationEventArgs e)
{
Windows.ApplicationModel.DataTransfer.Clipboard.ContentChanged += Clipboard_ContentChanged;
} protected override void OnNavigatedFrom(NavigationEventArgs e)
{
Windows.ApplicationModel.DataTransfer.Clipboard.ContentChanged -= Clipboard_ContentChanged;
} void Clipboard_ContentChanged(object sender, object e)
{
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "剪切板中的内容发生了变化";
} // 复制一段文本到剪切板
private void btnCopyText_Click(object sender, RoutedEventArgs e)
{
// 构造保存到剪切板的 DataPackage 对象
DataPackage dataPackage = new DataPackage();
dataPackage.SetText("I am webabcd: " + DateTime.Now.ToString()); try
{
Windows.ApplicationModel.DataTransfer.Clipboard.SetContent(dataPackage); // 保存 DataPackage 对象到剪切板
Windows.ApplicationModel.DataTransfer.Clipboard.Flush(); // 当此 app 关闭后,依然保留剪切板中的数据
lblMsg.Text = "已将内容复制到剪切板";
}
catch (Exception ex)
{
lblMsg.Text = ex.ToString();
}
} // 显示剪切板中的文本数据
private async void btnPasteText_Click(object sender, RoutedEventArgs e)
{
// 获取剪切板中的数据
DataPackageView dataPackageView = Windows.ApplicationModel.DataTransfer.Clipboard.GetContent(); // 如果剪切板中有文本数据,则获取并显示该文本
if (dataPackageView.Contains(StandardDataFormats.Text))
{
try
{
string text = await dataPackageView.GetTextAsync();
lblMsg.Text = text;
}
catch (Exception ex)
{
lblMsg.Text = ex.ToString();
}
}
else
{
lblMsg.Text = "剪切板中无文本内容";
}
} // 显示剪切板中包含的数据的格式类型,可能会有 StandardDataFormats 枚举的格式,也可能会有自定义的格式(关于自定义格式可以参见“分享”的 Demo)
private void btnShowAvailableFormats_Click(object sender, RoutedEventArgs e)
{
DataPackageView dataPackageView = Windows.ApplicationModel.DataTransfer.Clipboard.GetContent();
if (dataPackageView != null && dataPackageView.AvailableFormats.Count > )
{
var availableFormats = dataPackageView.AvailableFormats.GetEnumerator();
while (availableFormats.MoveNext())
{
lblMsg.Text += Environment.NewLine;
lblMsg.Text += availableFormats.Current;
}
}
else
{
lblMsg.Text = "剪切板中无任何内容";
}
} // 清除剪切板中的全部数据
private void btnClear_Click(object sender, RoutedEventArgs e)
{
Windows.ApplicationModel.DataTransfer.Clipboard.Clear();
}
}
}

2、演示如何复制 html 数据到剪切板,以及如何从剪切板中获取 html 数据 
App2AppCommunication/ClipboardCopyHtml.xaml

<Page
x:Class="Windows10.App2AppCommunication.ClipboardCopyHtml"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Windows10.App2AppCommunication"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <Grid Background="Transparent">
<StackPanel Margin="10 0 10 10"> <TextBlock Name="lblMsg" Margin="5" /> <Button Name="btnCopyHtml" Content="复制一段 html 到剪切板" Click="btnCopyHtml_Click" Margin="5" /> <Button Name="btnPasteHtml" Content="粘贴剪切板中的 html" Click="btnPasteHtml_Click" Margin="5" /> </StackPanel>
</Grid>
</Page>

App2AppCommunication/ClipboardCopyHtml.xaml.cs

/*
* 演示如何复制 html 数据到剪切板,以及如何从剪切板中获取 html 数据
*
* HtmlFormatHelper - 在 Clipboard 中传递 html 数据或在 ShareContract 中传递 html 数据时的帮助类
* CreateHtmlFormat() - 封装需要传递的 html 字符串,以便以 html 方式传递数据
* GetStaticFragment() - 解封装传递过来的经过封装的 html 数据,从而获取初始需要传递的 html 字符串
*/ using System;
using Windows.ApplicationModel.DataTransfer;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls; namespace Windows10.App2AppCommunication
{
public sealed partial class ClipboardCopyHtml : Page
{
public ClipboardCopyHtml()
{
this.InitializeComponent();
} // 复制 html 字符串到剪切板
private void btnCopyHtml_Click(object sender, RoutedEventArgs e)
{
DataPackage dataPackage = new DataPackage();
// 封装一下需要复制的 html 数据,以便以 html 的方式将数据复制到剪切板
string htmlFormat = HtmlFormatHelper.CreateHtmlFormat("<body>I am webabcd</body>");
dataPackage.SetHtmlFormat(htmlFormat); try
{
Windows.ApplicationModel.DataTransfer.Clipboard.SetContent(dataPackage);
lblMsg.Text = "已将内容复制到剪切板";
}
catch (Exception ex)
{
lblMsg.Text = ex.ToString();
}
} // 显示剪切板中的 html 数据
private async void btnPasteHtml_Click(object sender, RoutedEventArgs e)
{
DataPackageView dataPackageView = Windows.ApplicationModel.DataTransfer.Clipboard.GetContent(); if (dataPackageView.Contains(StandardDataFormats.Html))
{
try
{
// 封装后的数据
string htmlFormat = await dataPackageView.GetHtmlFormatAsync();
// 封装前的数据
string htmlFragment = HtmlFormatHelper.GetStaticFragment(htmlFormat); lblMsg.Text = "htmlFormat(封装后的数据): ";
lblMsg.Text += Environment.NewLine;
lblMsg.Text += htmlFormat;
lblMsg.Text += Environment.NewLine;
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "htmlFragment(封装前的数据): ";
lblMsg.Text += Environment.NewLine;
lblMsg.Text += htmlFragment;
}
catch (Exception ex)
{
lblMsg.Text = ex.ToString();
}
}
else
{
lblMsg.Text = "剪切板中无 html 内容";
}
}
}
}

3、演示如何复制图片内容剪切板,以及如何从剪切板中获取图片内容;演示如何通过 SetDataProvider() 延迟数据的复制,即在“粘贴”操作触发后由数据提供器生成相关数据
App2AppCommunication/ClipboardCopyImage.xaml

<Page
x:Class="Windows10.App2AppCommunication.ClipboardCopyImage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Windows10.App2AppCommunication"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <Grid Background="Transparent">
<StackPanel Margin="10 0 10 10"> <TextBlock Name="lblMsg" Margin="5" />
<Image Name="imgBitmap" Stretch="None" HorizontalAlignment="Left" Margin="5" /> <Button Name="btnCopyImage" Content="复制图片内容到剪切板" Click="btnCopyImage_Click" Margin="5" /> <Button Name="btnCopyImageWithDeferral" Content="复制数据提供器到剪切板,当“粘贴”操作被触发时由数据提供器生成用于粘贴的图片数据" Click="btnCopyImageWithDeferral_Click" Margin="5" /> <Button Name="btnPasteImage" Content="粘贴剪切板中的图片内容" Click="btnPasteImage_Click" Margin="5" /> </StackPanel>
</Grid>
</Page>

App2AppCommunication/ClipboardCopyImage.xaml.cs

/*
* 1、演示如何复制图片内容剪切板,以及如何从剪切板中获取图片内容
* 2、演示如何通过 SetDataProvider() 延迟数据的复制,即在“粘贴”操作触发后由数据提供器生成相关数据
*/ using System;
using Windows.ApplicationModel.DataTransfer;
using Windows.Graphics.Imaging;
using Windows.Storage;
using Windows.Storage.Streams;
using Windows.UI.Core;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging; namespace Windows10.App2AppCommunication
{
public sealed partial class ClipboardCopyImage : Page
{
public ClipboardCopyImage()
{
this.InitializeComponent();
} // 复制图片内容到剪切板
private void btnCopyImage_Click(object sender, RoutedEventArgs e)
{
DataPackage dataPackage = new DataPackage();
dataPackage.SetBitmap(RandomAccessStreamReference.CreateFromUri(new Uri("ms-appx:///Assets/StoreLogo.png", UriKind.Absolute))); try
{
Windows.ApplicationModel.DataTransfer.Clipboard.SetContent(dataPackage);
lblMsg.Text = "已将内容复制到剪切板";
}
catch (Exception ex)
{
lblMsg.Text = ex.ToString();
}
} // 延迟复制
private async void btnCopyImageWithDeferral_Click(object sender, RoutedEventArgs e)
{
StorageFile imageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/StoreLogo.png", UriKind.Absolute)); DataPackage dataPackage = new DataPackage();
dataPackage.SetDataProvider(StandardDataFormats.Bitmap, async (request) =>
{
/*
* 当从剪切板中获取 StandardDataFormats.Bitmap 数据时,会执行到此处以提供相关数据
*/ if (imageFile != null)
{
// 开始异步处理
var deferral = request.GetDeferral(); try
{
using (var imageStream = await imageFile.OpenAsync(FileAccessMode.Read))
{
// 将图片缩小一倍
BitmapDecoder imageDecoder = await BitmapDecoder.CreateAsync(imageStream);
var inMemoryStream = new InMemoryRandomAccessStream();
var imageEncoder = await BitmapEncoder.CreateForTranscodingAsync(inMemoryStream, imageDecoder);
imageEncoder.BitmapTransform.ScaledWidth = (uint)(imageDecoder.OrientedPixelWidth * 0.5);
imageEncoder.BitmapTransform.ScaledHeight = (uint)(imageDecoder.OrientedPixelHeight * 0.5);
await imageEncoder.FlushAsync(); // 指定需要复制到剪切板的数据
request.SetData(RandomAccessStreamReference.CreateFromStream(inMemoryStream)); await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
lblMsg.Text = "数据已生成";
});
}
}
finally
{
// 通知系统已完成异步操作
deferral.Complete();
}
}
}); try
{
Windows.ApplicationModel.DataTransfer.Clipboard.SetContent(dataPackage);
lblMsg.Text = "已将数据提供器复制到剪切板,在“粘贴”操作时才会生成数据";
}
catch (Exception ex)
{
lblMsg.Text = ex.ToString();
}
} // 显示剪切板中的图片内容
private async void btnPasteImage_Click(object sender, RoutedEventArgs e)
{
DataPackageView dataPackageView = Windows.ApplicationModel.DataTransfer.Clipboard.GetContent(); if (dataPackageView.Contains(StandardDataFormats.Bitmap))
{
try
{
IRandomAccessStreamReference randomStream = await dataPackageView.GetBitmapAsync();
if (randomStream != null)
{
using (IRandomAccessStreamWithContentType imageStream = await randomStream.OpenReadAsync())
{
BitmapImage bitmapImage = new BitmapImage();
bitmapImage.SetSource(imageStream);
imgBitmap.Source = bitmapImage;
}
}
}
catch (Exception ex)
{
lblMsg.Text = ex.ToString();
}
}
else
{
lblMsg.Text = "剪切板中无 bitmap 内容";
}
}
}
}

4、演示如何复制指定的文件到剪切板,以及如何从剪切板中获取文件并保存到指定的路径 
App2AppCommunication/ClipboardCopyFile.xaml

<Page
x:Class="Windows10.App2AppCommunication.ClipboardCopyFile"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Windows10.App2AppCommunication"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <Grid Background="Transparent">
<StackPanel Margin="10 0 10 10"> <TextBlock Name="lblMsg" TextWrapping="Wrap" Margin="5" /> <Button Name="btnCopyFile" Content="复制一个文件到剪切板" Click="btnCopyFile_Click" Margin="5" /> <Button Name="btnPasteFile" Content="粘贴剪切板中的文件到指定的路径" Click="btnPasteFile_Click" Margin="5" /> </StackPanel>
</Grid>
</Page>

App2AppCommunication/ClipboardCopyFile.xaml.cs

/*
* 演示如何复制指定的文件到剪切板,以及如何从剪切板中获取文件并保存到指定的路径
*/ using System;
using System.Linq;
using System.Collections.Generic;
using Windows.ApplicationModel.DataTransfer;
using Windows.Storage;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls; namespace Windows10.App2AppCommunication
{
public sealed partial class ClipboardCopyFile : Page
{
public ClipboardCopyFile()
{
this.InitializeComponent();
} // 保存文件到剪切板
private async void btnCopyFile_Click(object sender, RoutedEventArgs e)
{
StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(@"webabcdTest\clipboard.txt", CreationCollisionOption.ReplaceExisting);
await FileIO.WriteTextAsync(file, "I am webabcd: " + DateTime.Now.ToString()); DataPackage dataPackage = new DataPackage();
dataPackage.SetStorageItems(new List<StorageFile>() { file }); dataPackage.RequestedOperation = DataPackageOperation.Move;
try
{
Windows.ApplicationModel.DataTransfer.Clipboard.SetContent(dataPackage);
lblMsg.Text = "已将文件复制到剪切板";
}
catch (Exception ex)
{
lblMsg.Text = ex.ToString();
}
} // 从剪切板中获取文件并保存到指定的路径
private async void btnPasteFile_Click(object sender, RoutedEventArgs e)
{
DataPackageView dataPackageView = Windows.ApplicationModel.DataTransfer.Clipboard.GetContent(); if (dataPackageView.Contains(StandardDataFormats.StorageItems))
{
try
{
IReadOnlyList<IStorageItem> storageItems = await dataPackageView.GetStorageItemsAsync();
StorageFile file = storageItems.First() as StorageFile;
if (file != null)
{
StorageFile newFile = await file.CopyAsync(ApplicationData.Current.TemporaryFolder, file.Name, NameCollisionOption.ReplaceExisting);
if (newFile != null)
{
lblMsg.Text = string.Format("已将文件从{0}复制到{1}", file.Path, newFile.Path);
}
}
}
catch (Exception ex)
{
lblMsg.Text = ex.ToString();
}
}
else
{
lblMsg.Text = "剪切板中无 StorageItems 内容";
}
}
}
}

OK
[源码下载]

背水一战 Windows 10 (102) - 应用间通信: 剪切板的更多相关文章

  1. 背水一战 Windows 10 (100) - 应用间通信: 分享

    [源码下载] 背水一战 Windows 10 (100) - 应用间通信: 分享 作者:webabcd 介绍背水一战 Windows 10 之 应用间通信 分享 示例1.本例用于演示如何开发一个分享的 ...

  2. 背水一战 Windows 10 (101) - 应用间通信: 通过协议打开指定的 app 并传递数据以及获取返回数据, 将本 app 沙盒内的文件共享给其他 app 使用

    [源码下载] 背水一战 Windows 10 (101) - 应用间通信: 通过协议打开指定的 app 并传递数据以及获取返回数据, 将本 app 沙盒内的文件共享给其他 app 使用 作者:weba ...

  3. 背水一战 Windows 10 (56) - 控件(集合类): ListViewBase - 基础知识, 拖动项

    [源码下载] 背水一战 Windows 10 (56) - 控件(集合类): ListViewBase - 基础知识, 拖动项 作者:webabcd 介绍背水一战 Windows 10 之 控件(集合 ...

  4. 背水一战 Windows 10 (17) - 动画: ThemeTransition(过渡效果)

    [源码下载] 背水一战 Windows 10 (17) - 动画: ThemeTransition(过渡效果) 作者:webabcd 介绍背水一战 Windows 10 之 动画 ThemeTrans ...

  5. 背水一战 Windows 10 (38) - 控件(布局类): Panel, Canvas, RelativePanel, StackPanel, Grid

    [源码下载] 背水一战 Windows 10 (38) - 控件(布局类): Panel, Canvas, RelativePanel, StackPanel, Grid 作者:webabcd 介绍背 ...

  6. 背水一战 Windows 10 (120) - 后台任务: 后台上传任务

    [源码下载] 背水一战 Windows 10 (120) - 后台任务: 后台上传任务 作者:webabcd 介绍背水一战 Windows 10 之 后台任务 后台上传任务 示例演示 uwp 的后台上 ...

  7. 背水一战 Windows 10 (117) - 后台任务: 后台下载任务

    [源码下载] 背水一战 Windows 10 (117) - 后台任务: 后台下载任务 作者:webabcd 介绍背水一战 Windows 10 之 后台任务 后台下载任务 示例演示 uwp 的后台下 ...

  8. 背水一战 Windows 10 (114) - 后台任务: 后台任务的 Demo(与 app 不同进程), 后台任务的 Demo(与 app 相同进程)

    [源码下载] 背水一战 Windows 10 (114) - 后台任务: 后台任务的 Demo(与 app 不同进程), 后台任务的 Demo(与 app 相同进程) 作者:webabcd 介绍背水一 ...

  9. 背水一战 Windows 10 (111) - 通知(Tile): secondary tile 模板之图片, secondary tile 模板之分组

    [源码下载] 背水一战 Windows 10 (111) - 通知(Tile): secondary tile 模板之图片, secondary tile 模板之分组 作者:webabcd 介绍背水一 ...

随机推荐

  1. 从xampp到phpmyadmin

    目录 xampp的安装和配置 尝试运行Example11_1(图形化管理工具的可视化界面) 参考博文 xampp的安装和配置 主要参考博文Intellj IDEA 简易教程 1.下载并安装xampp ...

  2. python3 requestsGET请求传参

    GET方式传参方式一: import requests url = 'http://www.baidu.com/s?page=2' # 使用?携带参数 r = requests.get(url) pr ...

  3. SQLServer 中有五种约束, Primary Key 约束、 Foreign Key 约束、 Unique 约束、 Default 约束和 Check 约束

    一直在关注软件设计方面,数据库方面就忽略了很多,最近在设计数据库时遇到了一些小麻烦,主要是数据库中约束和性能调优方面的应用,以前在学习 Sql Server 2000,还有后来的 Sql Server ...

  4. docker log driver

    驱动程序 描述 none 容器没有日志可用,docker logs 什么都不返回 json-file 日志格式化为 JSON.这是 Docker 默认的日志驱动程序. syslog 将日志消息写入 s ...

  5. U-Mail企业邮箱如何导入授权文件

    首先,由于U-Mail有Linux版本与Windows版本的区别,并且都非常简单,所以就有了下面的步骤: Windows版本  <点击快速跳转> Linux版本 <点击快速跳转> ...

  6. tomcat中如何禁止列目录下的文件

    tomcat中如何禁止列目录下的文件在{tomcat_home}/conf/web.xml中,把listings参数设置成false即可,如下: <servlet> <servlet ...

  7. n2n网络环境搭建

    目的:   实现家中nas,在任何环境ssh访问 方案:n2n v1 (原因稳定&兼容macbook) 开源地址: https://svn.ntop.org/svn/ntop/trunk/n2 ...

  8. 利用WMITool解决Windows10 浏览器主页被hao123劫持问题

    利用Windows10 激活工具KMS10_1025激活系统之后会出现首页 被劫持的问题 解决办法如下 1.下载wmi tool 连接地址 链接: https://pan.baidu.com/s/1g ...

  9. 信息在DNN马尔科夫链结构上的变化

    一个经典的全连接神经网络,如下图所示,输入层可以看做T0,输出层可以看做$\hat{\mathrm{Y}}$=TL+1. 考虑每一层隐藏层T与X.Y的交互信息:I(X; Ti), I(Ti, Y),交 ...

  10. Effective Java --使类和成员的可访问性最小化

    尽可能地降低可访问性 接口和成员变量访问级别四种访问级别: 私有的(private) --- 只有在生命该成员的顶层类内部才可以访问 包级私有的(package-private) --- 缺省的&qu ...