Apply the solution, add the new test or that and simplified the test (#390)

pull/395/head
Ruofan 2023-04-16 01:28:46 +08:00 committed by GitHub
parent f4e78524ee
commit caae0d547a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 406 additions and 394 deletions

View File

@ -753,7 +753,7 @@ namespace Vanara.PInvoke
return charSet;
}
private static Encoding GetEncoding(ClipCorrespondingTypeAttribute attr) => (Encoding)Activator.CreateInstance(attr.EncodingType ?? typeof(UnicodeEncoding));
private static Encoding GetEncoding(ClipCorrespondingTypeAttribute attr) => (Encoding)Activator.CreateInstance(attr?.EncodingType ?? typeof(UnicodeEncoding));
/// <summary>
/// <para>

View File

@ -1,6 +1,5 @@
using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
@ -27,7 +26,7 @@ namespace Vanara.Windows.Shell.Tests
private const string url = "https://microsoft.com";
[Test]
public void zhuxbTest()
public void FileRelatedStructsInClipboardTest()
{
Thread STA = new(() =>
{
@ -35,30 +34,30 @@ namespace Vanara.Windows.Shell.Tests
try
{
NativeClipboard.Clear();
Clipboard.Clear();
ShellItemArray ShellItemList = new(files.Select(fn => new ShellItem(fn)));
var Data = NativeClipboard.CreateEmptyDataObject();
var Data = Clipboard.CreateEmptyDataObject();
Data.SetData(Shell32.ShellClipboardFormat.CFSTR_FILEDESCRIPTORW, new Shell32.FILEGROUPDESCRIPTOR
Data.SetData(ShellClipboardFormat.CFSTR_FILEDESCRIPTORW, new FILEGROUPDESCRIPTOR
{
cItems = (uint)ShellItemList.Count,
fgd = ShellItemList.Select((Item) =>
{
ShellFileInfo FileInfo = Item.FileInfo;
Shell32.FD_FLAGS Flags = Shell32.FD_FLAGS.FD_ATTRIBUTES
| Shell32.FD_FLAGS.FD_CREATETIME
| Shell32.FD_FLAGS.FD_ACCESSTIME
| Shell32.FD_FLAGS.FD_WRITESTIME
| Shell32.FD_FLAGS.FD_UNICODE;
FD_FLAGS Flags = FD_FLAGS.FD_ATTRIBUTES
| FD_FLAGS.FD_CREATETIME
| FD_FLAGS.FD_ACCESSTIME
| FD_FLAGS.FD_WRITESTIME
| FD_FLAGS.FD_UNICODE;
if (!Item.IsFolder)
{
Flags |= Shell32.FD_FLAGS.FD_FILESIZE;
Flags |= FD_FLAGS.FD_FILESIZE;
}
return new Shell32.FILEDESCRIPTOR
return new FILEDESCRIPTOR
{
cFileName = Item.Name,
dwFlags = Flags,
@ -77,26 +76,26 @@ namespace Vanara.Windows.Shell.Tests
if (!Item.IsFolder)
{
Data.SetData(Shell32.ShellClipboardFormat.CFSTR_FILECONTENTS, Item.GetHandler<IStream>(Shell32.ShellUtil.CreateBindCtx(STGM.STGM_READWRITE | STGM.STGM_SHARE_DENY_WRITE)), DVASPECT.DVASPECT_CONTENT, Index);
Data.SetData(ShellClipboardFormat.CFSTR_FILECONTENTS, Item.GetHandler<IStream>(ShellUtil.CreateBindCtx(STGM.STGM_READWRITE | STGM.STGM_SHARE_DENY_WRITE)), DVASPECT.DVASPECT_CONTENT, Index);
}
}
NativeClipboard.SetDataObject(Data);
Clipboard.SetDataObject(Data);
foreach (uint FormatId in NativeClipboard.CurrentlySupportedFormats)
foreach (uint FormatId in Clipboard.CurrentlySupportedFormats)
{
Debug.WriteLine($"Available format: {NativeClipboard.GetFormatName(FormatId)}");
Debug.WriteLine($"Available format: {Clipboard.GetFormatName(FormatId)}");
}
if ((NativeClipboard.IsFormatAvailable(Shell32.ShellClipboardFormat.CFSTR_FILEDESCRIPTORA) || NativeClipboard.IsFormatAvailable(Shell32.ShellClipboardFormat.CFSTR_FILEDESCRIPTORW)) && NativeClipboard.IsFormatAvailable(Shell32.ShellClipboardFormat.CFSTR_FILECONTENTS))
if ((Clipboard.IsFormatAvailable(ShellClipboardFormat.CFSTR_FILEDESCRIPTORA) || Clipboard.IsFormatAvailable(ShellClipboardFormat.CFSTR_FILEDESCRIPTORW)) && Clipboard.IsFormatAvailable(ShellClipboardFormat.CFSTR_FILECONTENTS))
{
Shell32.FILEGROUPDESCRIPTOR FileGroupDescriptor = NativeClipboard.IsFormatAvailable(Shell32.ShellClipboardFormat.CFSTR_FILEDESCRIPTORA)
? NativeClipboard.CurrentDataObject.GetData<Shell32.FILEGROUPDESCRIPTOR>(Shell32.ShellClipboardFormat.CFSTR_FILEDESCRIPTORA)
: NativeClipboard.CurrentDataObject.GetData<Shell32.FILEGROUPDESCRIPTOR>(Shell32.ShellClipboardFormat.CFSTR_FILEDESCRIPTORW);
FILEGROUPDESCRIPTOR FileGroupDescriptor = Clipboard.IsFormatAvailable(ShellClipboardFormat.CFSTR_FILEDESCRIPTORA)
? Clipboard.CurrentDataObject.GetData<FILEGROUPDESCRIPTOR>(ShellClipboardFormat.CFSTR_FILEDESCRIPTORA)
: Clipboard.CurrentDataObject.GetData<FILEGROUPDESCRIPTOR>(ShellClipboardFormat.CFSTR_FILEDESCRIPTORW);
for (int Index = 0; Index < FileGroupDescriptor.cItems; Index++)
{
Shell32.FILEDESCRIPTOR FileDescriptor = FileGroupDescriptor.fgd[Index];
FILEDESCRIPTOR FileDescriptor = FileGroupDescriptor.fgd[Index];
ulong Size = 0;
FileAttributes Attributes = default;
@ -104,33 +103,33 @@ namespace Vanara.Windows.Shell.Tests
DateTimeOffset LastAccessTime = default;
DateTimeOffset LastWriteTime = default;
if (FileDescriptor.dwFlags.HasFlag(Shell32.FD_FLAGS.FD_ATTRIBUTES))
if (FileDescriptor.dwFlags.HasFlag(FD_FLAGS.FD_ATTRIBUTES))
{
Attributes = (FileAttributes)FileDescriptor.dwFileAttributes;
}
if (FileDescriptor.dwFlags.HasFlag(Shell32.FD_FLAGS.FD_FILESIZE))
if (FileDescriptor.dwFlags.HasFlag(FD_FLAGS.FD_FILESIZE))
{
Size = FileDescriptor.nFileSize;
}
if (FileDescriptor.dwFlags.HasFlag(Shell32.FD_FLAGS.FD_CREATETIME))
if (FileDescriptor.dwFlags.HasFlag(FD_FLAGS.FD_CREATETIME))
{
CreateTime = FileDescriptor.ftCreationTime.ToDateTime();
}
if (FileDescriptor.dwFlags.HasFlag(Shell32.FD_FLAGS.FD_ACCESSTIME))
if (FileDescriptor.dwFlags.HasFlag(FD_FLAGS.FD_ACCESSTIME))
{
LastAccessTime = FileDescriptor.ftLastAccessTime.ToDateTime();
}
if (FileDescriptor.dwFlags.HasFlag(Shell32.FD_FLAGS.FD_WRITESTIME))
if (FileDescriptor.dwFlags.HasFlag(FD_FLAGS.FD_WRITESTIME))
{
LastWriteTime = FileDescriptor.ftLastWriteTime.ToDateTime();
}
//Throw Invalid FORMATETC structure
var result = NativeClipboard.CurrentDataObject.GetData(Shell32.ShellClipboardFormat.CFSTR_FILECONTENTS, index: Index);
var result = Clipboard.CurrentDataObject.GetData(ShellClipboardFormat.CFSTR_FILECONTENTS, index: Index);
}
}
}
@ -408,5 +407,18 @@ namespace Vanara.Windows.Shell.Tests
void OnUpdate(object sender, EventArgs e) => sawChange.Set();
}
[Test]
public void SetCustomFormatWithStringDataText()
{
const string Format = "TestFormat";
const string Data = "Test Data";
var ido = Clipboard.CreateEmptyDataObject();
ido.SetData(Format, Data);
Clipboard.SetDataObject(ido);
Assert.AreEqual(Data, Clipboard.CurrentDataObject.GetData<string>(Format));
}
}
}