Vanara/PInvoke/User32/WinUser.Clipboard.cs

1063 lines
53 KiB
C#
Raw Normal View History

using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Text;
namespace Vanara.PInvoke
{
public static partial class User32
{
/// <summary>Messages sent by Clipboard functions to the message window to notify of operations.</summary>
[PInvokeData("Winuser.h", MSDNShortId = "clipboard-notifications")]
public enum ClipboardNotificationMessage
{
/// <summary>
/// <para>
/// Sent to the clipboard owner by a clipboard viewer window to request the name of a <c>CF_OWNERDISPLAY</c> clipboard format.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// </summary>
/// <returns>
/// <para>If an application processes this message, it should return zero.</para>
/// </returns>
/// <remarks>
/// <para>
/// In response to this message, the clipboard owner should copy the name of the owner-display format to the specified buffer,
/// not exceeding the buffer size specified by the wParam parameter.
/// </para>
/// <para>
/// A clipboard viewer window sends this message to the clipboard owner to determine the name of the <c>CF_OWNERDISPLAY</c>
/// format for example, to initialize a menu listing available formats.
/// </para>
/// </remarks>
WM_ASKCBFORMATNAME = 0x030C,
/// <summary>
/// <para>Sent to the first window in the clipboard viewer chain when a window is being removed from the chain.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// </summary>
/// <returns>
/// <para>If an application processes this message, it should return zero.</para>
/// </returns>
/// <remarks>
/// <para>
/// Each clipboard viewer window saves the handle to the next window in the clipboard viewer chain. Initially, this handle is the
/// return value of the <c>SetClipboardViewer</c> function.
/// </para>
/// <para>
/// When a clipboard viewer window receives the <c>WM_CHANGECBCHAIN</c> message, it should call the <c>SendMessage</c> function
/// to pass the message to the next window in the chain, unless the next window is the window being removed. In this case, the
/// clipboard viewer should save the handle specified by the lParam parameter as the next window in the chain.
/// </para>
/// </remarks>
WM_CHANGECBCHAIN = 0x030D,
/// <summary>
/// <para>Sent when the contents of the clipboard have changed.</para>
/// </summary>
/// <returns>
/// <para>If an application processes this message, it should return zero.</para>
/// </returns>
/// <remarks>
/// <para>To register a window to receive this message, use the <c>AddClipboardFormatListener</c> function.</para>
/// </remarks>
WM_CLIPBOARDUPDATE = 0x031D,
/// <summary>
/// <para>Sent to the clipboard owner when a call to the <c>EmptyClipboard</c> function empties the clipboard.</para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// </summary>
/// <returns>
/// <para>If an application processes this message, it should return zero.</para>
/// </returns>
WM_DESTROYCLIPBOARD = 0x0307,
/// <summary>
/// <para>
/// Sent to the first window in the clipboard viewer chain when the content of the clipboard changes. This enables a clipboard
/// viewer window to display the new content of the clipboard.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// </summary>
/// <remarks>
/// <para>
/// Only clipboard viewer windows receive this message. These are windows that have been added to the clipboard viewer chain by
/// using the <c>SetClipboardViewer</c> function.
/// </para>
/// <para>
/// Each window that receives the <c>WM_DRAWCLIPBOARD</c> message must call the <c>SendMessage</c> function to pass the message
/// on to the next window in the clipboard viewer chain. The handle to the next window in the chain is returned by
/// <c>SetClipboardViewer</c>, and may change in response to a <c>WM_CHANGECBCHAIN</c> message.
/// </para>
/// </remarks>
WM_DRAWCLIPBOARD = 0x0308,
/// <summary>
/// <para>
/// Sent to the clipboard owner by a clipboard viewer window. This occurs when the clipboard contains data in the
/// <c>CF_OWNERDISPLAY</c> format and an event occurs in the clipboard viewer's horizontal scroll bar. The owner should scroll
/// the clipboard image and update the scroll bar values.
/// </para>
/// </summary>
/// <returns>
/// <para>If an application processes this message, it should return zero.</para>
/// </returns>
/// <remarks>
/// <para>
/// The clipboard owner can use the <c>ScrollWindow</c> function to scroll the image in the clipboard viewer window and
/// invalidate the appropriate region.
/// </para>
/// </remarks>
WM_HSCROLLCLIPBOARD = 0x030E,
/// <summary>
/// <para>
/// Sent to the clipboard owner by a clipboard viewer window when the clipboard contains data in the <c>CF_OWNERDISPLAY</c>
/// format and the clipboard viewer's client area needs repainting.
/// </para>
/// </summary>
/// <returns>
/// <para>If an application processes this message, it should return zero.</para>
/// </returns>
/// <remarks>
/// <para>
/// To determine whether the entire client area or just a portion of it needs repainting, the clipboard owner must compare the
/// dimensions of the drawing area given in the <c>rcPaint</c> member of <c>PAINTSTRUCT</c> to the dimensions given in the most
/// recent <c>WM_SIZECLIPBOARD</c> message.
/// </para>
/// <para>
/// The clipboard owner must use the <c>GlobalLock</c> function to lock the memory that contains the <c>PAINTSTRUCT</c>
/// structure. Before returning, the clipboard owner must unlock that memory by using the <c>GlobalUnlock</c> function.
/// </para>
/// </remarks>
WM_PAINTCLIPBOARD = 0x0309,
/// <summary>
/// <para>
/// Sent to the clipboard owner before it is destroyed, if the clipboard owner has delayed rendering one or more clipboard
/// formats. For the content of the clipboard to remain available to other applications, the clipboard owner must render data in
/// all the formats it is capable of generating, and place the data on the clipboard by calling the <c>SetClipboardData</c> function.
/// </para>
/// <para>A window receives this message through its <c>WindowProc</c> function.</para>
/// </summary>
/// <returns>
/// <para>If an application processes this message, it should return zero.</para>
/// </returns>
/// <remarks>
/// <para>
/// When responding to a <c>WM_RENDERALLFORMATS</c> message, the clipboard owner must call the <c>OpenClipboard</c> and
/// <c>EmptyClipboard</c> functions before calling <c>SetClipboardData</c>.
/// </para>
/// <para>
/// When the application returns, the system removes any unrendered formats from the list of available clipboard formats. For
/// information about delayed rendering, see <c>SetClipboardData</c>.
/// </para>
/// </remarks>
WM_RENDERALLFORMATS = 0x0306,
/// <summary>
/// <para>
/// Sent to the clipboard owner if it has delayed rendering a specific clipboard format and if an application has requested data
/// in that format. The clipboard owner must render data in the specified format and place it on the clipboard by calling the
/// <c>SetClipboardData</c> function.
/// </para>
/// </summary>
/// <returns>
/// <para>If an application processes this message, it should return zero.</para>
/// </returns>
/// <remarks>
/// <para>
/// When responding to a <c>WM_RENDERFORMAT</c> message, the clipboard owner must not open the clipboard before calling <c>SetClipboardData</c>.
/// </para>
/// </remarks>
WM_RENDERFORMAT = 0x0305,
/// <summary>
/// <para>
/// Sent to the clipboard owner by a clipboard viewer window when the clipboard contains data in the <c>CF_OWNERDISPLAY</c>
/// format and the clipboard viewer's client area has changed size.
/// </para>
/// </summary>
/// <returns>
/// <para>If an application processes this message, it should return zero.</para>
/// </returns>
/// <remarks>
/// <para>
/// When the clipboard viewer window is about to be destroyed or resized, a <c>WM_SIZECLIPBOARD</c> message is sent with a null
/// rectangle (0, 0, 0, 0) as the new size. This permits the clipboard owner to free its display resources.
/// </para>
/// <para>
/// The clipboard owner must use the <c>GlobalLock</c> function to lock the memory object that contains <c>RECT</c>. Before
/// returning, the clipboard owner must unlock the object by using the <c>GlobalUnlock</c> function.
/// </para>
/// </remarks>
WM_SIZECLIPBOARD = 0x030B,
/// <summary>
/// <para>
/// Sent to the clipboard owner by a clipboard viewer window when the clipboard contains data in the <c>CF_OWNERDISPLAY</c>
/// format and an event occurs in the clipboard viewer's vertical scroll bar. The owner should scroll the clipboard image and
/// update the scroll bar values.
/// </para>
/// </summary>
/// <returns>
/// <para>If an application processes this message, it should return zero.</para>
/// </returns>
/// <remarks>
/// <para>
/// The clipboard owner can use the <c>ScrollWindow</c> function to scroll the image in the clipboard viewer window and
/// invalidate the appropriate region.
/// </para>
/// </remarks>
WM_VSCROLLCLIPBOARD = 0x030A,
}
2018-11-28 14:33:55 -05:00
/// <summary>The clipboard formats defined by the system are called standard clipboard formats.</summary>
// https://docs.microsoft.com/en-us/windows/desktop/dataxchg/standard-clipboard-formats
[PInvokeData("Winuser.h", MSDNShortId = "f0af4e61-7ef1-4263-b2c5-e4114515124f")]
[Obsolete("Use Vanara.PInvoke.CLIPFORMAT instead. This enumeration will be removed in a future version.")]
public enum StandardClipboardFormat : uint
{
/// <summary>A handle to a bitmap (HBITMAP).</summary>
CF_BITMAP = 2,
/// <summary>A memory object containing a BITMAPINFO structure followed by the bitmap bits.</summary>
CF_DIB = 8,
/// <summary>
/// A memory object containing a BITMAPV5HEADER structure followed by the bitmap color space information and the bitmap bits.
/// </summary>
CF_DIBV5 = 17,
/// <summary>Software Arts' Data Interchange Format.</summary>
CF_DIF = 5,
/// <summary>
/// Bitmap display format associated with a private format. The hMem parameter must be a handle to data that can be displayed in
/// bitmap format in lieu of the privately formatted data.
/// </summary>
CF_DSPBITMAP = 0x0082,
/// <summary>
/// Enhanced metafile display format associated with a private format. The hMem parameter must be a handle to data that can be
/// displayed in enhanced metafile format in lieu of the privately formatted data.
/// </summary>
CF_DSPENHMETAFILE = 0x008E,
/// <summary>
/// Metafile-picture display format associated with a private format. The hMem parameter must be a handle to data that can be
/// displayed in metafile-picture format in lieu of the privately formatted data.
/// </summary>
CF_DSPMETAFILEPICT = 0x0083,
/// <summary>
/// Text display format associated with a private format. The hMem parameter must be a handle to data that can be displayed in
/// text format in lieu of the privately formatted data.
/// </summary>
CF_DSPTEXT = 0x0081,
/// <summary>A handle to an enhanced metafile (HENHMETAFILE).</summary>
CF_ENHMETAFILE = 14,
/// <summary>
/// Start of a range of integer values for application-defined GDI object clipboard formats. The end of the range is CF_GDIOBJLAST.
/// <para>
/// Handles associated with clipboard formats in this range are not automatically deleted using the GlobalFree function when the
/// clipboard is emptied. Also, when using values in this range, the hMem parameter is not a handle to a GDI object, but is a
/// handle allocated by the GlobalAlloc function with the GMEM_MOVEABLE flag.
/// </para>
/// </summary>
CF_GDIOBJFIRST = 0x0300,
/// <summary>See CF_GDIOBJFIRST.</summary>
CF_GDIOBJLAST = 0x03FF,
/// <summary>
/// A handle to type HDROP that identifies a list of files. An application can retrieve information about the files by passing
/// the handle to the DragQueryFile function.
/// </summary>
CF_HDROP = 15,
/// <summary>
/// The data is a handle to the locale identifier associated with text in the clipboard. When you close the clipboard, if it
/// contains CF_TEXT data but no CF_LOCALE data, the system automatically sets the CF_LOCALE format to the current input
/// language. You can use the CF_LOCALE format to associate a different locale with the clipboard text.
/// <para>
/// An application that pastes text from the clipboard can retrieve this format to determine which character set was used to
/// generate the text.
/// </para>
/// <para>
/// Note that the clipboard does not support plain text in multiple character sets. To achieve this, use a formatted text data
/// type such as RTF instead.
/// </para>
/// <para>
/// The system uses the code page associated with CF_LOCALE to implicitly convert from CF_TEXT to CF_UNICODETEXT. Therefore, the
/// correct code page table is used for the conversion.
/// </para>
/// </summary>
CF_LOCALE = 16,
/// <summary>
/// Handle to a metafile picture format as defined by the METAFILEPICT structure. When passing a CF_METAFILEPICT handle by means
/// of DDE, the application responsible for deleting hMem should also free the metafile referred to by the CF_METAFILEPICT handle.
/// </summary>
CF_METAFILEPICT = 3,
/// <summary>
/// Text format containing characters in the OEM character set. Each line ends with a carriage return/linefeed (CR-LF)
/// combination. A null character signals the end of the data.
/// </summary>
CF_OEMTEXT = 7,
/// <summary>
/// Owner-display format. The clipboard owner must display and update the clipboard viewer window, and receive the
/// WM_ASKCBFORMATNAME, WM_HSCROLLCLIPBOARD, WM_PAINTCLIPBOARD, WM_SIZECLIPBOARD, and WM_VSCROLLCLIPBOARD messages. The hMem
/// parameter must be NULL.
/// </summary>
CF_OWNERDISPLAY = 0x0080,
/// <summary>
/// Handle to a color palette. Whenever an application places data in the clipboard that depends on or assumes a color palette,
/// it should place the palette on the clipboard as well.
/// <para>
/// If the clipboard contains data in the CF_PALETTE (logical color palette) format, the application should use the SelectPalette
/// and RealizePalette functions to realize (compare) any other data in the clipboard against that logical palette.
/// </para>
/// <para>
/// When displaying clipboard data, the clipboard always uses as its current palette any object on the clipboard that is in the
/// CF_PALETTE format.
/// </para>
/// </summary>
CF_PALETTE = 9,
/// <summary>Data for the pen extensions to the Microsoft Windows for Pen Computing.</summary>
CF_PENDATA = 10,
/// <summary>
/// Start of a range of integer values for private clipboard formats. The range ends with CF_PRIVATELAST. Handles associated with
/// private clipboard formats are not freed automatically; the clipboard owner must free such handles, typically in response to
/// the WM_DESTROYCLIPBOARD message.
/// </summary>
CF_PRIVATEFIRST = 0x0200,
/// <summary>See CF_PRIVATEFIRST.</summary>
CF_PRIVATELAST = 0x02FF,
/// <summary>Represents audio data more complex than can be represented in a CF_WAVE standard wave format.</summary>
CF_RIFF = 11,
/// <summary>Microsoft Symbolic Link (SYLK) format.</summary>
CF_SYLK = 4,
/// <summary>
/// Text format. Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of the
/// data. Use this format for ANSI text.
/// </summary>
CF_TEXT = 1,
/// <summary>Tagged-image file format.</summary>
CF_TIFF = 6,
/// <summary>
/// Unicode text format. Each line ends with a carriage return/linefeed (CR-LF) combination. A null character signals the end of
/// the data.
/// </summary>
CF_UNICODETEXT = 13,
/// <summary>Represents audio data in one of the standard wave formats, such as 11 kHz or 22 kHz PCM.</summary>
CF_WAVE = 12,
}
/// <summary>
/// <para>Places the given window in the system-maintained clipboard format listener list.</para>
/// </summary>
/// <param name="hwnd">
/// <para>Type: <c>HWND</c></para>
/// <para>A handle to the window to be placed in the clipboard format listener list.</para>
/// </param>
/// <returns>
/// <para>Type: <c>BOOL</c></para>
/// <para>Returns <c>TRUE</c> if successful, <c>FALSE</c> otherwise. Call GetLastError for additional details.</para>
/// </returns>
/// <remarks>
/// <para>
/// When a window has been added to the clipboard format listener list, it is posted a WM_CLIPBOARDUPDATE message whenever the
/// contents of the clipboard have changed.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-addclipboardformatlistener BOOL
// AddClipboardFormatListener( HWND hwnd );
[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winuser.h", MSDNShortId = "addclipboardformatlistener")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool AddClipboardFormatListener(HWND hwnd);
/// <summary>
/// <para>Removes a specified window from the chain of clipboard viewers.</para>
/// </summary>
/// <param name="hWndRemove">
/// <para>Type: <c>HWND</c></para>
/// <para>A handle to the window to be removed from the chain. The handle must have been passed to the SetClipboardViewer function.</para>
/// </param>
/// <param name="hWndNewNext">
/// <para>Type: <c>HWND</c></para>
/// <para>
/// A handle to the window that follows the hWndRemove window in the clipboard viewer chain. (This is the handle returned by
/// SetClipboardViewer, unless the sequence was changed in response to a WM_CHANGECBCHAIN message.)
/// </para>
/// </param>
/// <returns>
/// <para>Type: <c>BOOL</c></para>
/// <para>
/// The return value indicates the result of passing the WM_CHANGECBCHAIN message to the windows in the clipboard viewer chain.
/// Because a window in the chain typically returns <c>FALSE</c> when it processes <c>WM_CHANGECBCHAIN</c>, the return value from
/// <c>ChangeClipboardChain</c> is typically <c>FALSE</c>. If there is only one window in the chain, the return value is typically <c>TRUE</c>.
/// </para>
/// </returns>
/// <remarks>
/// <para>
/// The window identified by hWndNewNext replaces the hWndRemove window in the chain. The SetClipboardViewer function sends a
/// WM_CHANGECBCHAIN message to the first window in the clipboard viewer chain.
/// </para>
/// <para>For an example, see Removing a Window from the Clipboard Viewer Chain.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-changeclipboardchain BOOL ChangeClipboardChain( HWND
// hWndRemove, HWND hWndNewNext );
[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
[PInvokeData("winuser.h", MSDNShortId = "changeclipboardchain")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool ChangeClipboardChain(HWND hWndRemove, HWND hWndNewNext);
/// <summary>
/// <para>Closes the clipboard.</para>
/// </summary>
/// <returns>
/// <para>Type: <c>BOOL</c></para>
/// <para>If the function succeeds, the return value is nonzero.</para>
/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
/// </returns>
/// <remarks>
/// <para>
/// When the window has finished examining or changing the clipboard, close the clipboard by calling <c>CloseClipboard</c>. This
/// enables other windows to access the clipboard.
/// </para>
/// <para>Do not place an object on the clipboard after calling <c>CloseClipboard</c>.</para>
/// <para>Examples</para>
/// <para>For an example, see Example of a Clipboard Viewer.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-closeclipboard BOOL CloseClipboard( );
[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winuser.h", MSDNShortId = "closeclipboard")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CloseClipboard();
/// <summary>
/// <para>Retrieves the number of different data formats currently on the clipboard.</para>
/// </summary>
/// <returns>
/// <para>Type: <c>int</c></para>
/// <para>If the function succeeds, the return value is the number of different data formats currently on the clipboard.</para>
/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
/// </returns>
// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-countclipboardformats int CountClipboardFormats( );
[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winuser.h", MSDNShortId = "countclipboardformats")]
public static extern int CountClipboardFormats();
/// <summary>
/// <para>
/// Empties the clipboard and frees handles to data in the clipboard. The function then assigns ownership of the clipboard to the
/// window that currently has the clipboard open.
/// </para>
/// </summary>
/// <returns>
/// <para>Type: <c>BOOL</c></para>
/// <para>If the function succeeds, the return value is nonzero.</para>
/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
/// </returns>
/// <remarks>
/// <para>
/// Before calling <c>EmptyClipboard</c>, an application must open the clipboard by using the OpenClipboard function. If the
/// application specifies a <c>NULL</c> window handle when opening the clipboard, <c>EmptyClipboard</c> succeeds but sets the
/// clipboard owner to <c>NULL</c>. Note that this causes SetClipboardData to fail.
/// </para>
/// <para>Examples</para>
/// <para>For an example, see Copying Information to the Clipboard.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-emptyclipboard BOOL EmptyClipboard( );
[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winuser.h", MSDNShortId = "emptyclipboard")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool EmptyClipboard();
/// <summary>
/// <para>Enumerates the data formats currently available on the clipboard.</para>
/// <para>
/// Clipboard data formats are stored in an ordered list. To perform an enumeration of clipboard data formats, you make a series of
/// calls to the <c>EnumClipboardFormats</c> function. For each call, the format parameter specifies an available clipboard format,
/// and the function returns the next available clipboard format.
/// </para>
/// </summary>
/// <param name="format">
/// <para>Type: <c>UINT</c></para>
/// <para>A clipboard format that is known to be available.</para>
/// <para>
/// To start an enumeration of clipboard formats, set format to zero. When format is zero, the function retrieves the first available
/// clipboard format. For subsequent calls during an enumeration, set format to the result of the previous
/// <c>EnumClipboardFormats</c> call.
/// </para>
/// </param>
/// <returns>
/// <para>Type: <c>UINT</c></para>
/// <para>
/// If the function succeeds, the return value is the clipboard format that follows the specified format, namely the next available
/// clipboard format.
/// </para>
/// <para>
/// If the function fails, the return value is zero. To get extended error information, call GetLastError. If the clipboard is not
/// open, the function fails.
/// </para>
/// <para>
/// If there are no more clipboard formats to enumerate, the return value is zero. In this case, the GetLastError function returns
/// the value <c>ERROR_SUCCESS</c>. This lets you distinguish between function failure and the end of enumeration.
/// </para>
/// </returns>
/// <remarks>
/// <para>
/// You must open the clipboard before enumerating its formats. Use the OpenClipboard function to open the clipboard. The
/// <c>EnumClipboardFormats</c> function fails if the clipboard is not open.
/// </para>
/// <para>
/// The <c>EnumClipboardFormats</c> function enumerates formats in the order that they were placed on the clipboard. If you are
/// copying information to the clipboard, add clipboard objects in order from the most descriptive clipboard format to the least
/// descriptive clipboard format. If you are pasting information from the clipboard, retrieve the first clipboard format that you can
/// handle. That will be the most descriptive clipboard format that you can handle.
/// </para>
/// <para>
/// The system provides automatic type conversions for certain clipboard formats. In the case of such a format, this function
/// enumerates the specified format, then enumerates the formats to which it can be converted. For more information, see Standard
/// Clipboard Formats and Synthesized Clipboard Formats.
/// </para>
/// <para>Examples</para>
/// <para>For an example, see Example of a Clipboard Viewer.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-enumclipboardformats UINT EnumClipboardFormats( UINT
// format );
[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winuser.h", MSDNShortId = "enumclipboardformats")]
public static extern uint EnumClipboardFormats(uint format);
/// <summary>
/// <para>Enumerates the data formats currently available on the clipboard.</para>
/// <para>Clipboard data formats are stored in an ordered list.</para>
/// </summary>
/// <returns>An enumeration of the data formats currently available on the clipboard.</returns>
/// <remarks>
/// <para>
/// You must open the clipboard before enumerating its formats. Use the OpenClipboard function to open the clipboard. The
/// <c>EnumClipboardFormats</c> function fails if the clipboard is not open.
/// </para>
/// <para>
/// The <c>EnumClipboardFormats</c> function enumerates formats in the order that they were placed on the clipboard. If you are
/// copying information to the clipboard, add clipboard objects in order from the most descriptive clipboard format to the least
/// descriptive clipboard format. If you are pasting information from the clipboard, retrieve the first clipboard format that you can
/// handle. That will be the most descriptive clipboard format that you can handle.
/// </para>
/// <para>
/// The system provides automatic type conversions for certain clipboard formats. In the case of such a format, this function
/// enumerates the specified format, then enumerates the formats to which it can be converted. For more information, see Standard
/// Clipboard Formats and Synthesized Clipboard Formats.
/// </para>
/// </remarks>
public static IEnumerable<uint> EnumClipboardFormats()
{
var fmt = 0U;
while (true)
{
fmt = EnumClipboardFormats(fmt);
if (fmt > 0)
yield return fmt;
else
{
Win32Error.GetLastError().ThrowIfFailed();
break;
}
}
}
/// <summary>
/// <para>Retrieves data from the clipboard in a specified format. The clipboard must have been opened previously.</para>
/// </summary>
/// <param name="uFormat">
/// <para>Type: <c>UINT</c></para>
/// <para>A clipboard format. For a description of the standard clipboard formats, see Standard Clipboard Formats.</para>
/// </param>
/// <returns>
/// <para>Type: <c>HANDLE</c></para>
/// <para>If the function succeeds, the return value is the handle to a clipboard object in the specified format.</para>
/// <para>If the function fails, the return value is <c>NULL</c>. To get extended error information, call GetLastError.</para>
/// </returns>
/// <remarks>
/// <para><c>Caution</c> Clipboard data is not trusted. Parse the data carefully before using it in your application.</para>
/// <para>An application can enumerate the available formats in advance by using the EnumClipboardFormats function.</para>
/// <para>
/// The clipboard controls the handle that the <c>GetClipboardData</c> function returns, not the application. The application should
/// copy the data immediately. The application must not free the handle nor leave it locked. The application must not use the handle
/// after the EmptyClipboard or CloseClipboard function is called, or after the SetClipboardData function is called with the same
/// clipboard format.
/// </para>
/// <para>
/// The system performs implicit data format conversions between certain clipboard formats when an application calls the
/// <c>GetClipboardData</c> function. For example, if the CF_OEMTEXT format is on the clipboard, a window can retrieve data in the
/// CF_TEXT format. The format on the clipboard is converted to the requested format on demand. For more information, see Synthesized
/// Clipboard Formats.
/// </para>
/// <para>Examples</para>
/// <para>For an example, see Copying Information to the Clipboard.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getclipboarddata HANDLE GetClipboardData( UINT uFormat );
[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winuser.h", MSDNShortId = "getclipboarddata")]
public static extern IntPtr GetClipboardData(uint uFormat);
/// <summary>
/// <para>
/// Retrieves from the clipboard the name of the specified registered format. The function copies the name to the specified buffer.
/// </para>
/// </summary>
/// <param name="format">
/// <para>Type: <c>UINT</c></para>
/// <para>The type of format to be retrieved. This parameter must not specify any of the predefined clipboard formats.</para>
/// </param>
/// <param name="lpszFormatName">
/// <para>Type: <c>LPTSTR</c></para>
/// <para>The buffer that is to receive the format name.</para>
/// </param>
/// <param name="cchMaxCount">
/// <para>Type: <c>int</c></para>
/// <para>The maximum length, in characters, of the string to be copied to the buffer. If the name exceeds this limit, it is truncated.</para>
/// </param>
/// <returns>
/// <para>Type: <c>int</c></para>
/// <para>If the function succeeds, the return value is the length, in characters, of the string copied to the buffer.</para>
/// <para>
/// If the function fails, the return value is zero, indicating that the requested format does not exist or is predefined. To get
/// extended error information, call GetLastError.
/// </para>
/// </returns>
/// <remarks>
/// <para>Security Considerations</para>
/// <para>
/// Using this function incorrectly might compromise the security of your program. For example, miscalculating the proper size of the
/// lpszFormatName buffer, especially when the application is used in both ANSI and Unicode versions, can cause a buffer overflow.
/// Also, note that the string is truncated if it is longer than the cchMaxCount parameter, which can lead to loss of information.
/// </para>
/// <para>Examples</para>
/// <para>For an example, see Example of a Clipboard Viewer.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getclipboardformatnamea int GetClipboardFormatNameA( UINT
// format, LPSTR lpszFormatName, int cchMaxCount );
[DllImport(Lib.User32, SetLastError = true, CharSet = CharSet.Auto)]
[PInvokeData("winuser.h", MSDNShortId = "getclipboardformatname")]
public static extern int GetClipboardFormatName(uint format, StringBuilder lpszFormatName, int cchMaxCount);
/// <summary>
/// <para>Retrieves the window handle of the current owner of the clipboard.</para>
/// </summary>
/// <returns>
/// <para>Type: <c>HWND</c></para>
/// <para>If the function succeeds, the return value is the handle to the window that owns the clipboard.</para>
/// <para>If the clipboard is not owned, the return value is <c>NULL</c>. To get extended error information, call GetLastError.</para>
/// </returns>
/// <remarks>
/// <para>The clipboard can still contain data even if the clipboard is not currently owned.</para>
/// <para>
/// In general, the clipboard owner is the window that last placed data in clipboard. The EmptyClipboard function assigns clipboard ownership.
/// </para>
/// <para>Examples</para>
/// <para>For an example, see Example of a Clipboard Viewer.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getclipboardowner HWND GetClipboardOwner( );
[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winuser.h", MSDNShortId = "getclipboardowner")]
public static extern HWND GetClipboardOwner();
/// <summary>
/// <para>Retrieves the clipboard sequence number for the current window station.</para>
/// </summary>
/// <returns>
/// <para>Type: <c>DWORD</c></para>
/// <para>
/// The return value is the clipboard sequence number. If you do not have <c>WINSTA_ACCESSCLIPBOARD</c> access to the window station,
/// the function returns zero.
/// </para>
/// </returns>
/// <remarks>
/// <para>
/// The system keeps a serial number for the clipboard for each window station. This number is incremented whenever the contents of
/// the clipboard change or the clipboard is emptied. You can track this value to determine whether the clipboard contents have
/// changed and optimize creating DataObjects. If clipboard rendering is delayed, the sequence number is not incremented until the
/// changes are rendered.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getclipboardsequencenumber DWORD
// GetClipboardSequenceNumber( );
[DllImport(Lib.User32, SetLastError = false, ExactSpelling = true)]
[PInvokeData("winuser.h", MSDNShortId = "getclipboardsequencenumber")]
public static extern uint GetClipboardSequenceNumber();
/// <summary>
/// <para>Retrieves the handle to the first window in the clipboard viewer chain.</para>
/// </summary>
/// <returns>
/// <para>Type: <c>HWND</c></para>
/// <para>If the function succeeds, the return value is the handle to the first window in the clipboard viewer chain.</para>
/// <para>If there is no clipboard viewer, the return value is <c>NULL</c>. To get extended error information, call GetLastError.</para>
/// </returns>
// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getclipboardviewer HWND GetClipboardViewer( );
[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winuser.h", MSDNShortId = "getclipboardviewer")]
public static extern HWND GetClipboardViewer();
/// <summary>
/// <para>Retrieves the handle to the window that currently has the clipboard open.</para>
/// </summary>
/// <returns>
/// <para>Type: <c>HWND</c></para>
/// <para>
/// If the function succeeds, the return value is the handle to the window that has the clipboard open. If no window has the
/// clipboard open, the return value is <c>NULL</c>. To get extended error information, call GetLastError.
/// </para>
/// </returns>
/// <remarks>
/// <para>
/// If an application or DLL specifies a <c>NULL</c> window handle when calling the OpenClipboard function, the clipboard is opened
/// but is not associated with a window. In such a case, <c>GetOpenClipboardWindow</c> returns <c>NULL</c>.
/// </para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getopenclipboardwindow HWND GetOpenClipboardWindow( );
[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winuser.h", MSDNShortId = "getopenclipboardwindow")]
public static extern HWND GetOpenClipboardWindow();
/// <summary>
/// <para>Retrieves the first available clipboard format in the specified list.</para>
/// </summary>
/// <param name="paFormatPriorityList">
/// <para>Type: <c>UINT*</c></para>
/// <para>
/// The clipboard formats, in priority order. For a description of the standard clipboard formats, see Standard Clipboard Formats .
/// </para>
/// </param>
/// <param name="cFormats">
/// <para>Type: <c>int</c></para>
/// <para>
/// The number of entries in the paFormatPriorityList array. This value must not be greater than the number of entries in the list.
/// </para>
/// </param>
/// <returns>
/// <para>Type: <c>int</c></para>
/// <para>
/// If the function succeeds, the return value is the first clipboard format in the list for which data is available. If the
/// clipboard is empty, the return value is NULL. If the clipboard contains data, but not in any of the specified formats, the return
/// value is 1. To get extended error information, call GetLastError.
/// </para>
/// </returns>
// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getpriorityclipboardformat int GetPriorityClipboardFormat(
// UINT *paFormatPriorityList, int cFormats );
[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winuser.h", MSDNShortId = "getpriorityclipboardformat")]
public static extern int GetPriorityClipboardFormat([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] uint[] paFormatPriorityList, int cFormats);
/// <summary>
/// <para>Retrieves the currently supported clipboard formats.</para>
/// </summary>
/// <param name="lpuiFormats">
/// <para>Type: <c>PUINT</c></para>
/// <para>An array of clipboard formats. For a description of the standard clipboard formats, see Standard Clipboard Formats.</para>
/// </param>
/// <param name="cFormats">
/// <para>Type: <c>UINT</c></para>
/// <para>The number of entries in the array pointed to by lpuiFormats.</para>
/// </param>
/// <param name="pcFormatsOut">
/// <para>Type: <c>PUINT</c></para>
/// <para>The actual number of clipboard formats in the array pointed to by lpuiFormats.</para>
/// </param>
/// <returns>
/// <para>Type: <c>BOOL</c></para>
/// <para>The function returns <c>TRUE</c> if successful; otherwise, <c>FALSE</c>. Call GetLastError for additional details.</para>
/// </returns>
// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getupdatedclipboardformats BOOL
// GetUpdatedClipboardFormats( PUINT lpuiFormats, UINT cFormats, PUINT pcFormatsOut );
[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winuser.h", MSDNShortId = "getupdatedclipboardformats")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetUpdatedClipboardFormats([MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] uint[] lpuiFormats, uint cFormats, out uint pcFormatsOut);
/// <summary>
/// <para>Determines whether the clipboard contains data in the specified format.</para>
/// </summary>
/// <param name="format">
/// <para>Type: <c>UINT</c></para>
/// <para>
/// A standard or registered clipboard format. For a description of the standard clipboard formats, see Standard Clipboard Formats .
/// </para>
/// </param>
/// <returns>
/// <para>Type: <c>BOOL</c></para>
/// <para>If the clipboard format is available, the return value is nonzero.</para>
/// <para>If the clipboard format is not available, the return value is zero. To get extended error information, call GetLastError.</para>
/// </returns>
/// <remarks>
/// <para>
/// Typically, an application that recognizes only one clipboard format would call this function when processing the WM_INITMENU or
/// WM_INITMENUPOPUP message. The application would then enable or disable the Paste menu item, depending on the return value.
/// Applications that recognize more than one clipboard format should use the GetPriorityClipboardFormat function for this purpose.
/// </para>
/// <para>Examples</para>
/// <para>For an example, see Pasting Information from the Clipboard.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-isclipboardformatavailable BOOL
// IsClipboardFormatAvailable( UINT format );
[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winuser.h", MSDNShortId = "isclipboardformatavailable")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool IsClipboardFormatAvailable(uint format);
/// <summary>
/// <para>Opens the clipboard for examination and prevents other applications from modifying the clipboard content.</para>
/// </summary>
/// <param name="hWndNewOwner">
/// <para>Type: <c>HWND</c></para>
/// <para>
/// A handle to the window to be associated with the open clipboard. If this parameter is <c>NULL</c>, the open clipboard is
/// associated with the current task.
/// </para>
/// </param>
/// <returns>
/// <para>Type: <c>BOOL</c></para>
/// <para>If the function succeeds, the return value is nonzero.</para>
/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
/// </returns>
/// <remarks>
/// <para><c>OpenClipboard</c> fails if another window has the clipboard open.</para>
/// <para>An application should call the CloseClipboard function after every successful call to <c>OpenClipboard</c>.</para>
/// <para>
/// The window identified by the hWndNewOwner parameter does not become the clipboard owner unless the EmptyClipboard function is called.
/// </para>
/// <para>
/// If an application calls <c>OpenClipboard</c> with hwnd set to <c>NULL</c>, EmptyClipboard sets the clipboard owner to
/// <c>NULL</c>; this causes SetClipboardData to fail.
/// </para>
/// <para>Examples</para>
/// <para>For an example, see Copying Information to the Clipboard.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-openclipboard BOOL OpenClipboard( HWND hWndNewOwner );
[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winuser.h", MSDNShortId = "openclipboard")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool OpenClipboard(HWND hWndNewOwner);
/// <summary>
/// <para>Registers a new clipboard format. This format can then be used as a valid clipboard format.</para>
/// </summary>
/// <param name="lpszFormat">
/// <para>Type: <c>LPCTSTR</c></para>
/// <para>The name of the new format.</para>
/// </param>
/// <returns>
/// <para>Type: <c>UINT</c></para>
/// <para>If the function succeeds, the return value identifies the registered clipboard format.</para>
/// <para>If the function fails, the return value is zero. To get extended error information, call GetLastError.</para>
/// </returns>
/// <remarks>
/// <para>
/// If a registered format with the specified name already exists, a new format is not registered and the return value identifies the
/// existing format. This enables more than one application to copy and paste data using the same registered clipboard format. Note
/// that the format name comparison is case-insensitive.
/// </para>
/// <para>Registered clipboard formats are identified by values in the range 0xC000 through 0xFFFF.</para>
/// <para>
/// When registered clipboard formats are placed on or retrieved from the clipboard, they must be in the form of an <c>HGLOBAL</c> value.
/// </para>
/// <para>Examples</para>
/// <para>For an example, see Registering a Clipboard Format.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-registerclipboardformata UINT RegisterClipboardFormatA(
// LPCSTR lpszFormat );
[DllImport(Lib.User32, SetLastError = true, CharSet = CharSet.Auto)]
[PInvokeData("winuser.h", MSDNShortId = "registerclipboardformat")]
public static extern uint RegisterClipboardFormat(string lpszFormat);
/// <summary>
/// <para>Removes the given window from the system-maintained clipboard format listener list.</para>
/// </summary>
/// <param name="hwnd">
/// <para>Type: <c>HWND</c></para>
/// <para>A handle to the window to remove from the clipboard format listener list.</para>
/// </param>
/// <returns>
/// <para>Type: <c>BOOL</c></para>
/// <para>Returns <c>TRUE</c> if successful, <c>FALSE</c> otherwise. Call GetLastError for additional details.</para>
/// </returns>
/// <remarks>
/// <para>When a window has been removed from the clipboard format listener list, it will no longer receive WM_CLIPBOARDUPDATE messages.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-removeclipboardformatlistener BOOL
// RemoveClipboardFormatListener( HWND hwnd );
[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winuser.h", MSDNShortId = "removeclipboardformatlistener")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool RemoveClipboardFormatListener(HWND hwnd);
/// <summary>
/// <para>
/// Places data on the clipboard in a specified clipboard format. The window must be the current clipboard owner, and the application
/// must have called the OpenClipboard function. (When responding to the WM_RENDERFORMAT and WM_RENDERALLFORMATS messages, the
/// clipboard owner must not call <c>OpenClipboard</c> before calling <c>SetClipboardData</c>.)
/// </para>
/// </summary>
/// <param name="uFormat">
/// <para>Type: <c>UINT</c></para>
/// <para>
/// The clipboard format. This parameter can be a registered format or any of the standard clipboard formats. For more information,
/// see Standard Clipboard Formats and Registered Clipboard Formats.
/// </para>
/// </param>
/// <param name="hMem">
/// <para>Type: <c>HANDLE</c></para>
/// <para>
/// A handle to the data in the specified format. This parameter can be <c>NULL</c>, indicating that the window provides data in the
/// specified clipboard format (renders the format) upon request. If a window delays rendering, it must process the WM_RENDERFORMAT
/// and WM_RENDERALLFORMATS messages.
/// </para>
/// <para>
/// If <c>SetClipboardData</c> succeeds, the system owns the object identified by the hMem parameter. The application may not write
/// to or free the data once ownership has been transferred to the system, but it can lock and read from the data until the
/// CloseClipboard function is called. (The memory must be unlocked before the Clipboard is closed.) If the hMem parameter identifies
/// a memory object, the object must have been allocated using the function with the <c>GMEM_MOVEABLE</c> flag.
/// </para>
/// </param>
/// <returns>
/// <para>Type: <c>HANDLE</c></para>
/// <para>If the function succeeds, the return value is the handle to the data.</para>
/// <para>If the function fails, the return value is <c>NULL</c>. To get extended error information, call GetLastError.</para>
/// </returns>
/// <remarks>
/// <para>
/// <c>Windows 8:</c> Bitmaps to be shared with Windows Store app apps must be in the <c>CF_BITMAP</c> format (device-dependent bitmap).
/// </para>
/// <para>
/// If an application calls <c>SetClipboardData</c> in response to WM_RENDERFORMAT or WM_RENDERALLFORMATS, the application should not
/// use the handle after <c>SetClipboardData</c> has been called.
/// </para>
/// <para>
/// If an application calls OpenClipboard with hwnd set to <c>NULL</c>, EmptyClipboard sets the clipboard owner to <c>NULL</c>; this
/// causes <c>SetClipboardData</c> to fail.
/// </para>
/// <para>
/// The system performs implicit data format conversions between certain clipboard formats when an application calls the
/// GetClipboardData function. For example, if the <c>CF_OEMTEXT</c> format is on the clipboard, a window can retrieve data in the
/// <c>CF_TEXT</c> format. The format on the clipboard is converted to the requested format on demand. For more information, see
/// Synthesized Clipboard Formats.
/// </para>
/// <para>Examples</para>
/// <para>For an example, see Copying Information to the Clipboard.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setclipboarddata HANDLE SetClipboardData( UINT uFormat,
// HANDLE hMem );
[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winuser.h", MSDNShortId = "setclipboarddata")]
public static extern IntPtr SetClipboardData(uint uFormat, IntPtr hMem);
/// <summary>
/// <para>
/// Adds the specified window to the chain of clipboard viewers. Clipboard viewer windows receive a WM_DRAWCLIPBOARD message whenever
/// the content of the clipboard changes. This function is used for backward compatibility with earlier versions of Windows.
/// </para>
/// </summary>
/// <param name="hWndNewViewer">
/// <para>Type: <c>HWND</c></para>
/// <para>A handle to the window to be added to the clipboard chain.</para>
/// </param>
/// <returns>
/// <para>Type: <c>HWND</c></para>
/// <para>
/// If the function succeeds, the return value identifies the next window in the clipboard viewer chain. If an error occurs or there
/// are no other windows in the clipboard viewer chain, the return value is NULL. To get extended error information, call GetLastError.
/// </para>
/// </returns>
/// <remarks>
/// <para>
/// The windows that are part of the clipboard viewer chain, called clipboard viewer windows, must process the clipboard messages
/// WM_CHANGECBCHAIN and WM_DRAWCLIPBOARD. Each clipboard viewer window calls the SendMessage function to pass these messages to the
/// next window in the clipboard viewer chain.
/// </para>
/// <para>
/// A clipboard viewer window must eventually remove itself from the clipboard viewer chain by calling the ChangeClipboardChain
/// function — for example, in response to the WM_DESTROY message.
/// </para>
/// <para>
/// The <c>SetClipboardViewer</c> function exists to provide backward compatibility with earlier versions of Windows. The clipboard
/// viewer chain can be broken by an application that fails to handle the clipboard chain messages properly. New applications should
/// use more robust techniques such as the clipboard sequence number or the registration of a clipboard format listener. For further
/// details on these alternatives techniques, see Monitoring Clipboard Contents.
/// </para>
/// <para>Examples</para>
/// <para>For an example, see Adding a Window to the Clipboard Viewer Chain.</para>
/// </remarks>
// https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setclipboardviewer HWND SetClipboardViewer( HWND
// hWndNewViewer );
[DllImport(Lib.User32, SetLastError = true, ExactSpelling = true)]
[PInvokeData("winuser.h", MSDNShortId = "setclipboardviewer")]
public static extern HWND SetClipboardViewer(HWND hWndNewViewer);
/// <summary>
/// <para>Defines the metafile picture format used for exchanging metafile data through the clipboard.</para>
/// </summary>
// https://docs.microsoft.com/en-us/windows/desktop/api/wingdi/ns-wingdi-tagmetafilepict typedef struct tagMETAFILEPICT { LONG mm;
// LONG xExt; LONG yExt; HMETAFILE hMF; } METAFILEPICT, *LPMETAFILEPICT;
[PInvokeData("wingdi.h", MSDNShortId = "metafilepict")]
[StructLayout(LayoutKind.Sequential)]
public struct METAFILEPICT
{
/// <summary>
/// <para>Type: <c>LONG</c></para>
/// <para>The mapping mode in which the picture is drawn.</para>
/// </summary>
public int mm;
/// <summary>
/// <para>Type: <c>LONG</c></para>
/// <para>
/// The size of the metafile picture for all modes except the <c>MM_ISOTROPIC</c> and <c>MM_ANISOTROPIC</c> modes. (For more
/// information about these modes, see the <c>yExt</c> member.) The x-extent specifies the width of the rectangle within which
/// the picture is drawn. The coordinates are in units that correspond to the mapping mode.
/// </para>
/// </summary>
public int xExt;
/// <summary>
/// <para>Type: <c>LONG</c></para>
/// <para>
/// The size of the metafile picture for all modes except the <c>MM_ISOTROPIC</c> and <c>MM_ANISOTROPIC</c> modes. The y-extent
/// specifies the height of the rectangle within which the picture is drawn. The coordinates are in units that correspond to the
/// mapping mode. For <c>MM_ISOTROPIC</c> and <c>MM_ANISOTROPIC</c> modes, which can be scaled, the <c>xExt</c> and <c>yExt</c>
/// members contain an optional suggested size in <c>MM_HIMETRIC</c> units. For <c>MM_ANISOTROPIC</c> pictures, <c>xExt</c> and
/// <c>yExt</c> can be zero when no suggested size is supplied. For <c>MM_ISOTROPIC</c> pictures, an aspect ratio must be
/// supplied even when no suggested size is given. (If a suggested size is given, the aspect ratio is implied by the size.) To
/// give an aspect ratio without implying a suggested size, set <c>xExt</c> and <c>yExt</c> to negative values whose ratio is the
/// appropriate aspect ratio. The magnitude of the negative <c>xExt</c> and <c>yExt</c> values is ignored; only the ratio is used.
/// </para>
/// </summary>
public int yExt;
/// <summary>
/// <para>Type: <c>HMETAFILE</c></para>
/// <para>A handle to a memory metafile.</para>
/// </summary>
public HMETAFILE hMF;
}
}
}