| benf.org : excel stuff : office clipboard |
The office clipboard has a good deal of functional documentation, but no API, or operational documentation - I wanted to figure it out, so here's what I've worked out. It may be mildly inaccurate, it may be wildly wrong, but it fits empirically.
Microsoft's overview of the office clipboard.
A TechRepublic overview of how to use it.
As mentioned in the MSDN article, "You can copy items while using any program that provides copy and cut functionality, but you can only paste items into Word, Excel, PowerPoint, Microsoft Access, or Microsoft Outlook." - in order to do this, Office attaches itself to the Clipboard viewer chain, with SetClipboardViewer. Thus, it is notified of any clipboard changes (and can hence receive all items copied in any application, but only paste from the office clipboard while in an office app.).
The first office process which starts registers this, with its WndProc as the target. This means any time the contents of the windows clipboard changes, the office process gets a WM_DRAWCLIPBOARD message.
The binaries in the office suite forward these clipboard changes to MSO.DLL (a shared office component), which manages a common list of clipped items in shared memory. (If the office clipboard isn't enabled, it ignores this.) The shared clipboard is protected by a mutex, (which I believe is 'MU_ACB08' (not sure, TBD) ). Accesses to this mutex use a 5000ms timeout.
Office (inside MSO.DLL) then calls OleGetClipboard to retrieve the IDataObject from the clipboard.
If enabled, the tooltip detailling how many items are collected is presented. The limit of 24 items is hardcoded in office, both in terms of an absolute number, and because the buffer that collects this information isn't resizable.
Office takes the IDataObject pulled from the windows clipboard, and if it can be written to a stream, it's captured in %LOCALAPPDATA%\msohtml\ - Office has a list of clipboard formats it's happy supporting, and if your dataitem doesn't implement any of them, you get "Item not collected, format not supported by office clipboard." (several custom formats are checked for, as well as 1 (CF_TEXT),2 (CF_BITMAP) & D (UNICODETEXT) )
Since MSO.DLL manages the interesting functionality for the clipboard, it's possible to call into MSO directly to perform some manipulation of the clipboard.
MSOClipHelper provides two objects/interfaces, which can be used to manipulate the office clipboard. Note again, these work for me, and I've tested on several versions of office. But if you're not using a version I've coded for, they won't work.
Public Sub test()
Dim clp As MSOClipHelperLib.OfficeClipHelperFactory
Set clp = New MSOClipHelperLib.OfficeClipHelperFactory
Dim clpi As MSOClipHelperLib.OfficeClipHelper
Set clpi = clp.OfficeClipHelper
Debug.Print clpi.Description
Debug.Print clpi.NumClipItems
Call clpi.Clear
End Sub
Here, we create an OfficeClipHelper using the OfficeClipHelperFactory - the factory does a one off determination of how to call MSO.
before:

after:

The output in the immediate window is from
As you might have guessed from the above, I make no guarantees as to the efficacy of this code. Use at your own risk.
| Last updated 01/2010 |