c# - Clipboard.ContainsImage() 可靠甚至有用吗?

标签 c# .net winforms locking clipboard

Microsoft 文档中为 Clipboard.ContainsImage() 提供的示例包括以下内容:

System.Drawing.Image returnImage = null;
if (Clipboard.ContainsImage())
{
    returnImage = Clipboard.GetImage();
    ....
}

此方法的表面/标称行为是首先检查剪贴板是否包含图像,如果是,则获取该图像以供使用。返回 null否则。

但是,在对 ContainsImage() 的调用之间是不是有可能并调用GetImage() 另一个应用程序更改了剪贴板的内容?毕竟可能没有图像数据。

当剪贴板不包含图像时,GetImage() is documented返回 null .很好,但是调用 ContainsImage() 有什么意义呢?首先,如果你调用GetImage()无论如何都必须检查结果?

这不仅仅适用于此示例 - 调用 ContainsImage() 有什么用? 如果您真的需要剪贴板内容?

也许……

  • 它比调用 GetImage() 更高效,因此即使在一小部分情况下也值得这样做 GetImage()会失败吗?

  • 一些魔法锁定会自动解决这个问题(非常怀疑)?


ContainsImage() 的情况如果您不需要获取剪贴板内容,只是为了查看它们是否是图像,可能会有用。

最佳答案

假设您有一个按钮,并且您希望只要剪贴板中有图像就启用,否则禁用它。

定期调用 ContainsImage() 不会产生很大的开销,因为它是一个标志,在将图像设置为剪贴板时只设置一次)。但是每次获取图像本身只是为了确保剪贴板中有图像是昂贵的。

一个不同的例子:

想象一下,您有一个可以包含视频、图像或音频的 byte[]

public enum MediaType
{
    Audio,
    Video,
    Image,
    None
}

class MyData
{
     private byte mydata = null;
     private MediaType type = MediaType.None;
     public void SetData(byte[] data)
     {
          mydata = data;
          if(ImageValidation())  // a method that validates data is a valid image
              type = MediaType.Image;
          else if(VideoValidation())
              type = MediaType.Video;
          else if(AutioValidation())
              type = MediaType.Audio;
          else
              type = MediaType.None;
     }

     //I'm not going to create all get functions but just for one type

     public bool ContainsImage()   //costless
     {
          return type == MediaType.Image;
     }

     public Image GetImage()  //costly if there is an image
     {
          if(type == MediaType.Image)
              using (var ms = new MemoryStream(mydata))
              {
                   return Image.FromStream(ms);    
              }
          else
              return null;
     }
}

关于c# - Clipboard.ContainsImage() 可靠甚至有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55401512/

相关文章:

c# - 在 Application.Restart() 之前修改命令行参数

c# - 在实体接口(interface) (EF Core) 中声明要忽略的属性

c# - 这段代码能正确判断两种类型是否相等吗?

mysql - VB.NET 如何获取图像保存位置?

c# - 是否有 .Net 的内存缓存端口?

c# - 为 .NET 使用定义此 native 接口(interface)的最佳方法是什么?

c# - ElasticSearch Nest Aggregation添加其他字段

c# - Winforms 中的 Explorer.exe 浏览网络文件夹

c# - 在 datetime 变量中获取 24 小时时间格式

c# - 这些获取当前目录的方式有什么区别?