diff --git a/src/Snap.Hutao/Snap.Hutao.Test/JsonSerializeTest.cs b/src/Snap.Hutao/Snap.Hutao.Test/BaseClassLibrary/JsonSerializeTest.cs similarity index 98% rename from src/Snap.Hutao/Snap.Hutao.Test/JsonSerializeTest.cs rename to src/Snap.Hutao/Snap.Hutao.Test/BaseClassLibrary/JsonSerializeTest.cs index 2ec63fa2..f680883f 100644 --- a/src/Snap.Hutao/Snap.Hutao.Test/JsonSerializeTest.cs +++ b/src/Snap.Hutao/Snap.Hutao.Test/BaseClassLibrary/JsonSerializeTest.cs @@ -2,7 +2,7 @@ using System.Text.Json; using System.Text.Json.Serialization; -namespace Snap.Hutao.Test; +namespace Snap.Hutao.Test.BaseClassLibrary; [TestClass] public class JsonSerializeTest diff --git a/src/Snap.Hutao/Snap.Hutao.Test/DependencyInjectionTest.cs b/src/Snap.Hutao/Snap.Hutao.Test/PlatformExtensions/DependencyInjectionTest.cs similarity index 97% rename from src/Snap.Hutao/Snap.Hutao.Test/DependencyInjectionTest.cs rename to src/Snap.Hutao/Snap.Hutao.Test/PlatformExtensions/DependencyInjectionTest.cs index 05e390dd..f0026e20 100644 --- a/src/Snap.Hutao/Snap.Hutao.Test/DependencyInjectionTest.cs +++ b/src/Snap.Hutao/Snap.Hutao.Test/PlatformExtensions/DependencyInjectionTest.cs @@ -1,7 +1,7 @@ using Microsoft.Extensions.DependencyInjection; using System; -namespace Snap.Hutao.Test; +namespace Snap.Hutao.Test.PlatformExtensions; [TestClass] public sealed class DependencyInjectionTest diff --git a/src/Snap.Hutao/Snap.Hutao.Win32/NativeMethods.txt b/src/Snap.Hutao/Snap.Hutao.Win32/NativeMethods.txt index 88a7812e..ee0d767e 100644 --- a/src/Snap.Hutao/Snap.Hutao.Win32/NativeMethods.txt +++ b/src/Snap.Hutao/Snap.Hutao.Win32/NativeMethods.txt @@ -51,6 +51,8 @@ IPersistFile IShellLinkW ShellLink SHELL_LINK_DATA_FLAGS +FileOpenDialog +IFileOpenDialog // WinRT IMemoryBufferByteAccess diff --git a/src/Snap.Hutao/Snap.Hutao/Factory/Picker/IFileSystemPickerInteraction.cs b/src/Snap.Hutao/Snap.Hutao/Factory/Picker/IFileSystemPickerInteraction.cs new file mode 100644 index 00000000..bc085e6e --- /dev/null +++ b/src/Snap.Hutao/Snap.Hutao/Factory/Picker/IFileSystemPickerInteraction.cs @@ -0,0 +1,45 @@ +// Copyright (c) DGP Studio. All rights reserved. +// Licensed under the MIT license. + +using Snap.Hutao.Core.LifeCycle; +using System.Runtime.InteropServices; +using Windows.Win32; +using Windows.Win32.Foundation; +using Windows.Win32.System.Com; +using Windows.Win32.UI.Shell; +using static Windows.Win32.PInvoke; + +namespace Snap.Hutao.Factory.Picker; + +internal interface IFileSystemPickerInteraction +{ +} + +[ConstructorGenerated] +[Injection(InjectAs.Transient, typeof(IFileSystemPickerInteraction))] +internal sealed partial class FileSystemPickerInteraction : IFileSystemPickerInteraction +{ + private readonly ICurrentWindowReference currentWindowReference; + + public unsafe string PickFile() + { + HRESULT result = CoCreateInstance(default, CLSCTX.CLSCTX_INPROC_SERVER, out IFileOpenDialog dialog); + Marshal.ThrowExceptionForHR(result); + + dialog.Show(currentWindowReference.GetWindowHandle()); + dialog.GetResult(out IShellItem item); + PWSTR name = default; + string file; + try + { + item.GetDisplayName(SIGDN.SIGDN_FILESYSPATH, out name); + file = new((char*)name); + } + finally + { + Marshal.FreeCoTaskMem((nint)name.Value); + } + + return file; + } +} \ No newline at end of file diff --git a/src/Snap.Hutao/Snap.Hutao/Package.appxmanifest b/src/Snap.Hutao/Snap.Hutao/Package.appxmanifest index 9df9076c..3a3dac4c 100644 --- a/src/Snap.Hutao/Snap.Hutao/Package.appxmanifest +++ b/src/Snap.Hutao/Snap.Hutao/Package.appxmanifest @@ -12,7 +12,7 @@ + Version="1.7.18.0" /> Snap Hutao