如何在UWP中区分剪贴板内容变更来自本应用还是其他应用
UWP中区分剪贴板内容变更来源(本应用/其他应用)
UWP的Clipboard类没有直接提供判断内容变更来源的API,我们可以通过记录本应用复制的内容,再在ContentChanged事件中对比的方式来实现区分:
实现步骤
- 声明私有变量存储本应用最后一次复制到剪贴板的文本
- 在本应用的复制操作中,同步把复制的文本存入该变量
- 在
Clipboard_ContentChanged事件里,对比当前剪贴板文本和存储的变量,判断变更来源
修改后的完整代码
XAML(无需改动)
<Grid> <StackPanel> <Button x:Name="CopyToClipBoard" Click="CopyToClipBoard_Click">Copy To ClipBoard</Button> <TextBlock x:Name="CopiedFrom"> Clipboard Content Changed From : </TextBlock> <TextBlock x:Name="DispalyText" FontWeight="Bold"/> </StackPanel> </Grid>
C#代码
private string _lastCopiedTextFromApp; // 存储本应用复制的文本 public MainPage() { this.InitializeComponent(); Clipboard.ContentChanged += Clipboard_ContentChanged; } private async void Clipboard_ContentChanged(object sender, object e) { string str = ""; var clipboardContent = Clipboard.GetContent(); // 先判断剪贴板是否包含文本内容 if (clipboardContent.Contains(StandardDataFormats.Text)) { string currentClipboardText = await clipboardContent.GetTextAsync(); // 对比当前剪贴板文本和本应用最后复制的文本 if (!string.IsNullOrEmpty(_lastCopiedTextFromApp) && currentClipboardText == _lastCopiedTextFromApp) { str = "Text Copied from Our App"; // 执行本应用触发变更的操作(Action-1) _lastCopiedTextFromApp = null; // 重置变量,避免后续重复误判 } else { str = "Text Copied from other app"; // 执行其他应用触发变更的操作(Action-2) } DispalyText.Text = $"{str}: {currentClipboardText}"; } else { DispalyText.Text = "Clipboard content is not text"; } } private void CopyToClipBoard_Click(object sender, RoutedEventArgs e) { string copiedText = "Hello Clipboard !!"; DataPackage dataPackage = new DataPackage(); dataPackage.SetText(copiedText); Clipboard.SetContent(dataPackage); _lastCopiedTextFromApp = copiedText; // 记录本应用复制的文本 }
注意事项
- 匹配成功后要重置
_lastCopiedTextFromApp,避免用户后续从其他应用复制相同文本时误判 - 如果需要支持非文本格式的剪贴板内容,可以扩展逻辑,比如记录数据格式和内容哈希值,提升匹配准确性
内容的提问来源于stack exchange,提问作者PremKumar Shanmugam
相关产品推荐
相关产品推荐

