Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / WinForms / Managed / System / WinForms / Clipboard.cs / 1 / Clipboard.cs
//------------------------------------------------------------------------------
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//-----------------------------------------------------------------------------
/*
*/
namespace System.Windows.Forms {
using System;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using System.Security;
using IComDataObject = System.Runtime.InteropServices.ComTypes.IDataObject;
using System.Globalization;
using System.Security.Permissions;
using System.Collections;
///
///
/// Provides methods to place data on and retrieve data from the system clipboard. This class cannot be inherited.
///
public sealed class Clipboard {
// not creatable...
//
private Clipboard() {
}
//
// Checks the validity of format while setting data into ClipBoard
//
private static bool IsFormatValid(DataObject data)
{
string[] formats = data.GetFormats();
Debug.Assert(formats != null, "Null returned from GetFormats");
if (formats != null)
{
if (formats.Length <= 4)
{
for (int i=0; i
///
/// Places nonpersistent data on the system .
///
public static void SetDataObject(object data) {
SetDataObject(data, false);
}
///
///
/// Overload that uses default values for retryTimes and retryDelay.
///
public static void SetDataObject(object data, bool copy) {
SetDataObject(data, copy, 10 /*retryTimes*/, 100 /*retryDelay*/);
}
///
///
/// Places data on the system and uses copy to specify whether the data
/// should remain on the
/// after the application exits.
///
[UIPermission(SecurityAction.Demand, Clipboard=UIPermissionClipboard.OwnClipboard)]
public static void SetDataObject(object data, bool copy, int retryTimes, int retryDelay) {
if (Application.OleRequired() != System.Threading.ApartmentState.STA) {
throw new System.Threading.ThreadStateException(SR.GetString(SR.ThreadMustBeSTA));
}
if (data == null) {
throw new ArgumentNullException("data");
}
if (retryTimes < 0) {
throw new ArgumentOutOfRangeException("retryTimes", SR.GetString(SR.InvalidLowBoundArgumentEx, "retryTimes", retryTimes.ToString(CultureInfo.CurrentCulture), (0).ToString(CultureInfo.CurrentCulture)));
}
if (retryDelay < 0) {
throw new ArgumentOutOfRangeException("retryDelay", SR.GetString(SR.InvalidLowBoundArgumentEx, "retryDelay", retryDelay.ToString(CultureInfo.CurrentCulture), (0).ToString(CultureInfo.CurrentCulture)));
}
DataObject dataObject = null;
if (!(data is IComDataObject)) {
dataObject = new DataObject(data);
}
bool restrictedFormats = false;
// If the caller doesnt have AllClipBoard permission then we allow only restricted formats.
// These formats are TEXT, UNICODETEXT,String and CSV
try
{
IntSecurity.ClipboardRead.Demand();
}
catch (SecurityException)
{
// We dont have allClipBoard so we can set only data in the following formats
// TEXT, UNICODETEXT, and CSV.
restrictedFormats = true;
}
// Compute the format of the "data" passed in iff setText == true;
if (restrictedFormats)
{
if (dataObject == null)
{
dataObject = data as DataObject;
}
if (!IsFormatValid(dataObject))
{
throw new SecurityException(SR.GetString(SR.ClipboardSecurityException));
}
}
int hr, retry = retryTimes;
IntSecurity.UnmanagedCode.Assert();
try
{
do {
if (data is IComDataObject) {
hr = UnsafeNativeMethods.OleSetClipboard((IComDataObject)data);
}
else {
hr = UnsafeNativeMethods.OleSetClipboard(dataObject);
}
if (hr != 0) {
if (retry == 0) {
ThrowIfFailed(hr);
}
retry--;
System.Threading.Thread.Sleep(retryDelay /*ms*/);
}
}
while (hr != 0);
if (copy) {
retry = retryTimes;
do {
hr = UnsafeNativeMethods.OleFlushClipboard();
if (hr != 0) {
if (retry == 0) {
ThrowIfFailed(hr);
}
retry--;
System.Threading.Thread.Sleep(retryDelay /*ms*/);
}
}
while (hr != 0);
}
}
finally
{
CodeAccessPermission.RevertAssert();
}
}
///
///
/// Retrieves the data that is currently on the system
/// .
///
public static IDataObject GetDataObject() {
Debug.WriteLineIf(IntSecurity.SecurityDemand.TraceVerbose, "ClipboardRead Demanded");
IntSecurity.ClipboardRead.Demand();
if (Application.OleRequired() != System.Threading.ApartmentState.STA) {
// only throw if a message loop was started. This makes the case of trying
// to query the clipboard from your finalizer or non-ui MTA thread
// silently fail, instead of making your app die.
//
// however, if you are trying to write a normal windows forms app and
// forget to set the STAThread attribute, we will correctly report
// an error to aid in debugging.
//
if (Application.MessageLoop) {
throw new System.Threading.ThreadStateException(SR.GetString(SR.ThreadMustBeSTA));
}
else {
return null;
}
}
// Vswhidbey :: 476911. We need to retry the GetDataObject() since the clipBaord is busy sometimes and hence the GetDataObject would fail with ClipBoardException.
return GetDataObject(10 /*retryTimes*/, 100 /*retryDelay*/);
}
// Private method to help accessing clipBoard for know retries before failing.
private static IDataObject GetDataObject(int retryTimes, int retryDelay)
{
IComDataObject dataObject = null;
int hr, retry = retryTimes;
do {
hr = UnsafeNativeMethods.OleGetClipboard(ref dataObject);
if (hr != 0) {
if (retry == 0) {
ThrowIfFailed(hr);
}
retry--;
System.Threading.Thread.Sleep(retryDelay /*ms*/);
}
}
while (hr != 0);
if (dataObject != null) {
if (dataObject is IDataObject && !Marshal.IsComObject(dataObject)) {
return (IDataObject)dataObject;
}
else {
return new DataObject(dataObject);
}
}
return null;
}
// <-- WHIDBEY ADDITIONS
///
///
/// [To be supplied.]
///
public static void Clear() {
Clipboard.SetDataObject(new DataObject());
}
///
///
/// [To be supplied.]
///
public static bool ContainsAudio() {
IDataObject dataObject = Clipboard.GetDataObject();
if (dataObject != null) {
return dataObject.GetDataPresent(DataFormats.WaveAudio, false);
}
return false;
}
///
///
/// [To be supplied.]
///
public static bool ContainsData(string format) {
IDataObject dataObject = Clipboard.GetDataObject();
if (dataObject != null) {
return dataObject.GetDataPresent(format, false);
}
return false;
}
///
///
/// [To be supplied.]
///
public static bool ContainsFileDropList() {
IDataObject dataObject = Clipboard.GetDataObject();
if (dataObject != null) {
return dataObject.GetDataPresent(DataFormats.FileDrop, true);
}
return false;
}
///
///
/// [To be supplied.]
///
public static bool ContainsImage() {
IDataObject dataObject = Clipboard.GetDataObject();
if (dataObject != null) {
return dataObject.GetDataPresent(DataFormats.Bitmap, true);
}
return false;
}
///
///
/// [To be supplied.]
///
public static bool ContainsText() {
if (Environment.OSVersion.Platform != System.PlatformID.Win32NT ||
Environment.OSVersion.Version.Major < 5)
{
return ContainsText(TextDataFormat.Text);
}
else {
return ContainsText(TextDataFormat.UnicodeText);
}
}
///
///
/// [To be supplied.]
///
public static bool ContainsText(TextDataFormat format) {
// valid values are 0x0-0x4 inclusive
if (!ClientUtils.IsEnumValid(format, (int)format, (int)TextDataFormat.Text, (int)TextDataFormat.CommaSeparatedValue)){
throw new InvalidEnumArgumentException("format", (int)format, typeof(TextDataFormat));
}
IDataObject dataObject = Clipboard.GetDataObject();
if (dataObject != null) {
return dataObject.GetDataPresent(ConvertToDataFormats(format), false);
}
return false;
}
///
///
/// [To be supplied.]
///
public static Stream GetAudioStream() {
IDataObject dataObject = Clipboard.GetDataObject();
if (dataObject != null) {
return dataObject.GetData(DataFormats.WaveAudio, false) as Stream;
}
return null;
}
///
///
/// [To be supplied.]
///
public static object GetData(string format) {
IDataObject dataObject = Clipboard.GetDataObject();
if (dataObject != null) {
return dataObject.GetData(format);
}
return null;
}
///
///
/// [To be supplied.]
///
public static StringCollection GetFileDropList() {
IDataObject dataObject = Clipboard.GetDataObject();
StringCollection retVal = new StringCollection();
if (dataObject != null) {
string[] strings = dataObject.GetData(DataFormats.FileDrop, true) as string[];
if (strings != null) {
retVal.AddRange(strings);
}
}
return retVal;
}
///
///
/// [To be supplied.]
///
public static Image GetImage() {
IDataObject dataObject = Clipboard.GetDataObject();
if (dataObject != null) {
return dataObject.GetData(DataFormats.Bitmap, true) as Image;
}
return null;
}
///
///
/// [To be supplied.]
///
public static string GetText() {
// Pass in Text format for Win98...
if (Environment.OSVersion.Platform != System.PlatformID.Win32NT ||
Environment.OSVersion.Version.Major < 5)
{
return GetText(TextDataFormat.Text);
}
else {
return GetText(TextDataFormat.UnicodeText);
}
}
///
///
/// [To be supplied.]
///
public static string GetText(TextDataFormat format) {
// valid values are 0x0 to 0x4 inclusive
if (!ClientUtils.IsEnumValid(format, (int)format, (int)TextDataFormat.Text, (int)TextDataFormat.CommaSeparatedValue))
{
throw new InvalidEnumArgumentException("format", (int)format, typeof(TextDataFormat));
}
IDataObject dataObject = Clipboard.GetDataObject();
if (dataObject != null) {
string text = dataObject.GetData(ConvertToDataFormats(format), false) as string;
if (text != null) {
return text;
}
}
return String.Empty;
}
///
///
/// [To be supplied.]
///
public static void SetAudio(byte[] audioBytes) {
if (audioBytes == null) {
throw new ArgumentNullException("audioBytes");
}
SetAudio(new MemoryStream(audioBytes));
}
///
///
/// [To be supplied.]
///
public static void SetAudio(Stream audioStream) {
if (audioStream == null) {
throw new ArgumentNullException("audioStream");
}
IDataObject dataObject = new DataObject();
dataObject.SetData(DataFormats.WaveAudio, false, audioStream);
Clipboard.SetDataObject(dataObject, true);
}
///
///
/// [To be supplied.]
///
public static void SetData(string format, object data) {
//Note: We delegate argument checking to IDataObject.SetData, if it wants to do so.
IDataObject dataObject = new DataObject();
dataObject.SetData(format, data);
Clipboard.SetDataObject(dataObject, true);
}
///
///
/// [To be supplied.]
///
public static void SetFileDropList(StringCollection filePaths) {
if (filePaths == null) {
throw new ArgumentNullException("filePaths");
}
// VsWhidbey:432618 throw Argument exception for zero-length filepath collection.
if (filePaths.Count == 0)
{
throw new ArgumentException(SR.GetString(SR.CollectionEmptyException));
}
//VSWhidbey #163538 - Validate the paths to make sure they don't contain invalid characters
foreach (string path in filePaths) {
try {
string temp = Path.GetFullPath(path);
}
catch (Exception e) {
if (ClientUtils.IsSecurityOrCriticalException(e)) {
throw;
}
throw new ArgumentException(SR.GetString(SR.Clipboard_InvalidPath, path, "filePaths"), e);
}
}
if (filePaths.Count > 0) {
IDataObject dataObject = new DataObject();
string[] strings = new string[filePaths.Count];
filePaths.CopyTo(strings, 0);
dataObject.SetData(DataFormats.FileDrop, true, strings);
Clipboard.SetDataObject(dataObject, true);
}
}
///
///
/// [To be supplied.]
///
public static void SetImage(Image image) {
if (image == null) {
throw new ArgumentNullException("image");
}
IDataObject dataObject = new DataObject();
dataObject.SetData(DataFormats.Bitmap, true, image);
Clipboard.SetDataObject(dataObject, true);
}
///
///
/// [To be supplied.]
///
public static void SetText(string text) {
// Pass in Text format for Win98...
if (Environment.OSVersion.Platform != System.PlatformID.Win32NT ||
Environment.OSVersion.Version.Major < 5)
{
SetText(text, TextDataFormat.Text);
}
else {
SetText(text, TextDataFormat.UnicodeText);
}
}
///
///
/// [To be supplied.]
///
public static void SetText(string text, TextDataFormat format) {
if (String.IsNullOrEmpty(text)) {
throw new ArgumentNullException("text");
}
//valid values are 0x0 to 0x4
if (!ClientUtils.IsEnumValid(format, (int)format, (int)TextDataFormat.Text, (int)TextDataFormat.CommaSeparatedValue))
{
throw new InvalidEnumArgumentException("format", (int)format, typeof(TextDataFormat));
}
IDataObject dataObject = new DataObject();
dataObject.SetData(ConvertToDataFormats(format), false, text);
Clipboard.SetDataObject(dataObject, true);
}
private static string ConvertToDataFormats(TextDataFormat format) {
switch (format) {
case TextDataFormat.Text:
return DataFormats.Text;
case TextDataFormat.UnicodeText:
return DataFormats.UnicodeText;
case TextDataFormat.Rtf:
return DataFormats.Rtf;
case TextDataFormat.Html:
return DataFormats.Html;
case TextDataFormat.CommaSeparatedValue:
return DataFormats.CommaSeparatedValue;
}
return DataFormats.UnicodeText;
}
// END - WHIDBEY ADDITIONS -->
private static void ThrowIfFailed(int hr) {
//
if (hr != 0) {
ExternalException e = new ExternalException(SR.GetString(SR.ClipboardOperationFailed), hr);
throw e;
}
}
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu

This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- TrackPoint.cs
- Matrix.cs
- ClientConfigurationHost.cs
- SqlCrossApplyToCrossJoin.cs
- basecomparevalidator.cs
- PingOptions.cs
- ResourcePropertyMemberCodeDomSerializer.cs
- UrlPropertyAttribute.cs
- filewebresponse.cs
- CollectionsUtil.cs
- DBBindings.cs
- DefaultMemberAttribute.cs
- GuidelineSet.cs
- AnonymousIdentificationModule.cs
- Attribute.cs
- DataTransferEventArgs.cs
- DbConnectionStringCommon.cs
- UpDownEvent.cs
- SafeWaitHandle.cs
- DeferredBinaryDeserializerExtension.cs
- DesignBindingEditor.cs
- ResourceDisplayNameAttribute.cs
- BufferedGraphics.cs
- CodeValidator.cs
- TransportChannelFactory.cs
- CqlParserHelpers.cs
- InheritablePropertyChangeInfo.cs
- AlphaSortedEnumConverter.cs
- RC2.cs
- SiteMembershipCondition.cs
- ComEventsInfo.cs
- TextFormatterContext.cs
- RijndaelManagedTransform.cs
- StorageMappingFragment.cs
- ApplicationTrust.cs
- smtppermission.cs
- Image.cs
- GcSettings.cs
- CardSpaceShim.cs
- MenuAdapter.cs
- ContainerFilterService.cs
- SafeIUnknown.cs
- TransformerTypeCollection.cs
- PropertyBuilder.cs
- WebService.cs
- PageBreakRecord.cs
- FontResourceCache.cs
- Registry.cs
- ListViewInsertEventArgs.cs
- XmlStreamNodeWriter.cs
- WsdlInspector.cs
- RtfNavigator.cs
- XmlRawWriter.cs
- NotImplementedException.cs
- ModelPerspective.cs
- DiffuseMaterial.cs
- HostingEnvironment.cs
- XmlSchema.cs
- DataPointer.cs
- Transform3D.cs
- InstanceLockedException.cs
- NamespaceCollection.cs
- BehaviorEditorPart.cs
- StrokeCollectionConverter.cs
- Select.cs
- QuaternionAnimation.cs
- Panel.cs
- SystemSounds.cs
- SqlDataSourceEnumerator.cs
- CheckBoxStandardAdapter.cs
- ModelItemImpl.cs
- ReflectionHelper.cs
- SQLResource.cs
- EventHandlersStore.cs
- _ReceiveMessageOverlappedAsyncResult.cs
- ADMembershipProvider.cs
- DecimalConstantAttribute.cs
- TypeDescriptionProvider.cs
- MetadataItemEmitter.cs
- ExpressionNormalizer.cs
- WebPartConnectionsConnectVerb.cs
- RegexCode.cs
- ProfileService.cs
- MimeTypeMapper.cs
- EditorPartCollection.cs
- QueryCreatedEventArgs.cs
- RuleConditionDialog.cs
- AuthStoreRoleProvider.cs
- SemanticTag.cs
- IPCCacheManager.cs
- NumberFunctions.cs
- IconHelper.cs
- TabPageDesigner.cs
- ImpersonateTokenRef.cs
- typedescriptorpermission.cs
- ExpressionEditorAttribute.cs
- ChannelBinding.cs
- X509ChainElement.cs
- ReversePositionQuery.cs
- CodeMethodInvokeExpression.cs