Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Clipboard.ContainsImage()可靠还是有用?_C#_.net_Winforms_Locking_Clipboard - Fatal编程技术网

C# Clipboard.ContainsImage()可靠还是有用?

C# Clipboard.ContainsImage()可靠还是有用?,c#,.net,winforms,locking,clipboard,C#,.net,Winforms,Locking,Clipboard,Microsoft文档中提供的示例包括以下内容: System.Drawing.Image returnImage = null; if (Clipboard.ContainsImage()) { returnImage = Clipboard.GetImage(); .... } 此方法的表面/名义行为是首先检查剪贴板是否包含图像,如果包含,则获取该图像以供使用。否则返回null 但是,在调用ContainsImage()和调用GetImage()之间,另一个应用程序是否可能

Microsoft文档中提供的示例包括以下内容:

System.Drawing.Image returnImage = null;
if (Clipboard.ContainsImage())
{
    returnImage = Clipboard.GetImage();
    ....
}
此方法的表面/名义行为是首先检查剪贴板是否包含图像,如果包含,则获取该图像以供使用。否则返回
null

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

当剪贴板不包含图像时,
GetImage()
返回
null
。很好,但是如果在调用
GetImage()
时必须检查结果,那么调用
ContainsImage()
首先有什么意义呢

这不仅仅适用于本例-如果您确实需要剪贴板内容,调用
ContainsImage()
有什么用?

也许

  • 它的性能比调用
    GetImage()
    更高,因此即使在一小部分情况下
    GetImage()
    会失败,它也值得一试

  • 正在进行某种魔法锁定,自动解决此问题(非常可疑)



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

假设您有一个按钮,希望在剪贴板中有图像时启用该按钮,否则将其禁用

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

另一个例子是:

假设您有
字节[]
,可以包含视频、图像或音频

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;
     }
}

如果我从word文档中同时复制文本和图像会怎么样?ContainesImage将返回true还是false?GetImage将做什么?在这种情况下,也许GetImage只是从剪贴板中获取图像的一种方法?如果您先获取内容,然后使用。我的经验是,剪贴板不太可靠,剪贴板操作可能会失败。与任何共享资源一样,其状态可能会在没有适当锁定机制的情况下发生更改(例如,在尝试访问文件之前检查文件是否存在可防止异常和谬误)。WinForm Clipboard类不提供锁定机制,因此,是的,检查其状态所做的只是告知检查执行时的状态。在下一条指令执行之前,状态可能会改变。@TnTinMn谢谢,这是我想象的。至少在某些情况下,文件是由你的应用程序控制的,因此它们消失的可能性很小——但在剪贴板上却不是这样!我仍然想知道这个功能存在的具体原因是什么(如果有的话)。你也可以使用将你的应用程序添加到剪贴板链,这样你就可以非常安全地检查剪贴板的内容,如果它发生了更改,而不需要其他人的阻挠。比轮询更好。您可以使用剪贴板.GetDataObject()执行此操作,然后对其执行
.GetDataPresent(identifier)
。可以查找标识符。图像的处理包括“位图”、“DeviceIndependentBitmap”、“Format17”和“PNG”,但它们在检索方式上都需要稍微不同的处理。