C# Clipboard.ContainsImage()可靠还是有用?
Microsoft文档中提供的示例包括以下内容: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()之间,另一个应用程序是否可能
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”,但它们在检索方式上都需要稍微不同的处理。