diff --git a/PInvoke/Shell32/Clipboard.cs b/PInvoke/Shell32/Clipboard.cs
index 9d89534f..c0c7b31c 100644
--- a/PInvoke/Shell32/Clipboard.cs
+++ b/PInvoke/Shell32/Clipboard.cs
@@ -204,62 +204,26 @@ namespace Vanara.PInvoke
lindex = index,
tymed = tymed
};
- STGMEDIUM medium = new() { tymed = attr?.Medium ?? TYMED.TYMED_HGLOBAL };
- dataObj.GetData(ref formatetc, out medium);
+ //STGMEDIUM medium = new() { tymed = attr?.Medium ?? TYMED.TYMED_HGLOBAL };
+ dataObj.GetData(ref formatetc, out var medium);
- // Handle TYMED values
+ // Handle TYMED values, passing through HGLOBAL
bool userFree = medium.pUnkForRelease is null;
- switch (medium.tymed)
- {
- case TYMED.TYMED_HGLOBAL:
- // Pass this one through
- break;
-
- case TYMED.TYMED_FILE:
- return new SafeMoveableHGlobalHandle(medium.unionmember, userFree).ToString(-1, CharSet.Ansi);
-
- case TYMED.TYMED_ISTREAM:
- return Marshal.GetObjectForIUnknown(medium.unionmember) as IStream;
-
- case TYMED.TYMED_ISTORAGE:
- return Marshal.GetObjectForIUnknown(medium.unionmember) as IStorage;
-
- case TYMED.TYMED_GDI:
- if (userFree)
- {
- return new SafeHBITMAP(medium.unionmember);
- }
- else
- {
- return (HBITMAP)medium.unionmember;
- }
-
- case TYMED.TYMED_MFPICT:
- if (userFree)
- {
- return new SafeHMETAFILE(medium.unionmember);
- }
- else
- {
- return (HMETAFILE)medium.unionmember;
- }
-
- case TYMED.TYMED_ENHMF:
- if (userFree)
- {
- return new SafeHENHMETAFILE(medium.unionmember);
- }
- else
- {
- return (HENHMETAFILE)medium.unionmember;
- }
-
- case TYMED.TYMED_NULL:
- return null;
-
- default:
- throw new InvalidOperationException();
- }
+ if (medium.tymed != TYMED.TYMED_HGLOBAL)
+ return medium.tymed switch
+ {
+ TYMED.TYMED_FILE => new SafeMoveableHGlobalHandle(medium.unionmember, userFree).ToString(-1, CharSet.Ansi),
+ TYMED.TYMED_ISTREAM => Marshal.GetObjectForIUnknown(medium.unionmember) as IStream,
+ TYMED.TYMED_ISTORAGE => Marshal.GetObjectForIUnknown(medium.unionmember) as IStorage,
+ TYMED.TYMED_GDI when userFree => new SafeHBITMAP(medium.unionmember),
+ TYMED.TYMED_GDI when !userFree => (HBITMAP)medium.unionmember,
+ TYMED.TYMED_MFPICT when userFree => new SafeHMETAFILE(medium.unionmember),
+ TYMED.TYMED_MFPICT when !userFree => (HMETAFILE)medium.unionmember,
+ TYMED.TYMED_ENHMF when userFree => new SafeHENHMETAFILE(medium.unionmember),
+ TYMED.TYMED_ENHMF when !userFree => (HENHMETAFILE)medium.unionmember,
+ TYMED.TYMED_NULL => null,
+ _ => throw new InvalidOperationException(),
+ };
using SafeMoveableHGlobalHandle hmem = new(medium.unionmember, userFree);
try
@@ -320,8 +284,10 @@ namespace Vanara.PInvoke
/// Part of the aspect when the data must be split across page boundaries. The most common value is -1, which identifies all of the
/// data. For the aspects DVASPECT_THUMBNAIL and DVASPECT_ICON, lindex is ignored.
///
+ /// The character set to use for string types.
/// The object associated with the request. If no object can be determined, default(T) is returned.
- public static T GetData(this IDataObject dataObj, uint formatId, int index = -1)
+ /// This format does not support direct type access. - formatId
+ public static T GetData(this IDataObject dataObj, uint formatId, int index = -1, CharSet charSet = CharSet.Auto)
{
FORMATETC formatetc = new()
{
@@ -330,8 +296,8 @@ namespace Vanara.PInvoke
lindex = index,
tymed = TYMED.TYMED_HGLOBAL
};
- STGMEDIUM medium = new() { tymed = TYMED.TYMED_HGLOBAL };
- dataObj.GetData(ref formatetc, out medium);
+ //STGMEDIUM medium = new() { tymed = TYMED.TYMED_HGLOBAL };
+ dataObj.GetData(ref formatetc, out var medium);
if (medium.tymed != TYMED.TYMED_HGLOBAL)
throw new ArgumentException("This format does not support direct type access.", nameof(formatId));
if (medium.unionmember == default)
@@ -340,7 +306,7 @@ namespace Vanara.PInvoke
try
{
hmem.Lock();
- return hmem.ToType();
+ return hmem.ToType(charSet == CharSet.Auto ? (StringHelper.GetCharSize(charSet) == 1 ? CharSet.Ansi : CharSet.Unicode) : charSet);
}
finally
{
@@ -861,7 +827,9 @@ namespace Vanara.PInvoke
public string cFileName;
/// The file size, in bytes.
+#pragma warning disable IDE1006 // Naming Styles
public ulong nFileSize
+#pragma warning restore IDE1006 // Naming Styles
{
get => Macros.MAKELONG64(nFileSizeLow, nFileSizeHigh);
set
@@ -1562,6 +1530,7 @@ namespace Vanara.PInvoke
public override IntPtr Write(object value) => base.Write(FormatHtmlForClipboard((string)value));
}
+
internal class ClipboardSerializedFormatter : IClipboardFormatter
{
private static readonly byte[] guid = new Guid("FD9EA796-3B13-4370-A679-56106BB288FB").ToByteArray();