olegetclipboard (ole32)
Last changed: Kevin Westhead-193.129.24.5

.
Summary
Retrieves a data object that you can use to access the contents of the clipboard.

C# Signature:

alternative

[DllImport("ole32.dll")]
static extern int OleGetClipboard([MarshalAs(UnmanagedType.IUnknown)]out object ppDataObj);

original

[DllImport("ole32.dll")]
static extern int OleGetClipboard(out IDataObject ppDataObj);

User-Defined Types:

None.

Notes:

The original signature requires a definition for the COM version of IDataObject, as defined in objidl.h. The lack of this definition implies that the System.Windows.Forms.IDataObject interface can be used, but this interface, although COM-visible, is not the same as the COM one and results in a System.InvalidCastException.

The alternative posted uses an object, which can then be passed to a System.Windows.Forms.DataObject ctor. Ideally though there should be a complete definition for the COM IDataObject interface (and all of its supporting types).

Tips & Tricks:

I find it better to turn off PreserveSig for methods that return an HRESULT and have a trailing out parameter, providing that the HRESULT does not have more that one success code (typically S_OK only). This results in a slightly cleaner syntax where the out parameter becomes the return value and a failing HRESULT results in an exception.

[DllImport("ole32.dll", PreserveSig=false)]
[return: MarshalAs(UnmanagedType.IUnknown)]
static extern object OleGetClipboard();

C# Sample Code:

using System.Diagnostics;
using System.Runtime.Interop;
using System.Windows.Forms;

PreserveSig=true

class Program
{
    [DllImport("ole32.dll")]
    static extern int OleGetClipboard([MarshalAs(UnmanagedType.IUnknown)]out object ppDataObj);

    [STAThread()]
    static void Main(string[] args)
    {
       object unk;
       int    result = OleGetClipboard(out unk);

       Debug.Assert(result == 0);
       DataObject data = new DataObject(unk);

       foreach (string format in data.GetFormats())
      Debug.WriteLine(format);
    }
}

PreserveSig=false

class Program
{
    [DllImport("ole32.dll", PreserveSig=false)]
    [return: MarshalAs(UnmanagedType.IUnknown)]
    static extern object OleGetClipboard();

    [STAThread()]
    static void Main(string[] args)
    {
       object     unk = OleGetClipboard();
       DataObject data = new DataObject(unk);

       foreach (string format in data.GetFormats())
      Debug.WriteLine(format);
    }
}

Alternative Managed API:

System.Windows.Forms.Clipboard.GetDataObject

Documentation