From 48454aa4a87bf9efaa40eae1eb5f1545054a4502 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E6=80=A1=E9=A3=9E?= <363301617@qq.com> Date: Wed, 4 Sep 2024 22:26:52 +0800 Subject: [PATCH] Use ShellExecute to replace CreateProcesss Use ShellExecute to replace CreateProcesss --- GetStoreApp/GetStoreApp.res | Bin 438024 -> 438024 bytes .../Controls/Store/QueryLinksHelper.cs | 6 +- GetStoreApp/Helpers/Root/ProcessHelper.cs | 36 ------ GetStoreApp/Helpers/Root/RuntimeHelper.cs | 2 +- GetStoreApp/Properties/AssemblyInfo.cs | 6 +- .../Services/Root/ToastNotificationService.cs | 5 +- .../Download/CompletedControl.xaml.cs | 4 +- .../WinGet/InstalledAppsControl.xaml.cs | 8 +- .../Controls/WinGet/SearchAppsControl.xaml.cs | 6 +- .../WinGet/UpgradableAppsControl.xaml.cs | 6 +- .../Views/Pages/AppManagerPage.xaml.cs | 3 +- GetStoreApp/Views/Pages/AppUpdatePage.xaml.cs | 2 +- GetStoreApp/Views/Pages/SettingsPage.xaml.cs | 4 +- GetStoreApp/Views/Windows/MainWindow.xaml.cs | 2 +- .../PInvoke/Kernel32/CREATE_PROCESS_FLAGS.cs | 117 ------------------ .../PInvoke/Kernel32/EDesiredAccess.cs | 103 --------------- .../PInvoke/Kernel32/Kernel32Library.cs | 78 ------------ .../PInvoke/Kernel32/PROCESS_INFORMATION.cs | 32 ----- .../PInvoke/Kernel32/SECURITY_ATTRIBUTES.cs | 28 ----- .../WindowsAPI/PInvoke/Kernel32/STARTF.cs | 98 --------------- .../PInvoke/Kernel32/STARTUPINFO.cs | 114 ----------------- .../PInvoke/Shell32/Shell32Library.cs | 16 ++- GetStoreAppPackage/Package.appxmanifest | 2 +- GetStoreAppWebView/GetStoreAppWebView.res | Bin 438092 -> 438092 bytes .../Controls/Extensions/WebView2Helper.cs | 10 +- .../ComTypes/IGraphicsEffectD2D1Interop.cs | 20 +-- .../Properties/AssemblyInfo.cs | 6 +- .../Properties/AssemblyInfo.cs | 6 +- 28 files changed, 69 insertions(+), 651 deletions(-) delete mode 100644 GetStoreApp/WindowsAPI/PInvoke/Kernel32/CREATE_PROCESS_FLAGS.cs delete mode 100644 GetStoreApp/WindowsAPI/PInvoke/Kernel32/EDesiredAccess.cs delete mode 100644 GetStoreApp/WindowsAPI/PInvoke/Kernel32/PROCESS_INFORMATION.cs delete mode 100644 GetStoreApp/WindowsAPI/PInvoke/Kernel32/SECURITY_ATTRIBUTES.cs delete mode 100644 GetStoreApp/WindowsAPI/PInvoke/Kernel32/STARTF.cs delete mode 100644 GetStoreApp/WindowsAPI/PInvoke/Kernel32/STARTUPINFO.cs diff --git a/GetStoreApp/GetStoreApp.res b/GetStoreApp/GetStoreApp.res index 19b240982c184a34b40cbdf45c6022d57b5861be..f62c2edae00474124a70c04c5fd242742929c0ee 100644 GIT binary patch delta 59 zcmeCUC)IIJs-cCkg{g(Pg{6gc3!Bm`&JJca1{MYehK}jlv)FnWO{VXh#kQN#WP9ms Owqiyg{c;YQybu68aT2Wn delta 59 zcmeCUC)IIJs-cCkg{g(Pg{6gc3!Bm`&NgN?1{MYehPLV2v)FnWji&FM#kQN#XnW~w Owqiyg{c;YQybu67l@g-> diff --git a/GetStoreApp/Helpers/Controls/Store/QueryLinksHelper.cs b/GetStoreApp/Helpers/Controls/Store/QueryLinksHelper.cs index dc6b933e6..516f52171 100644 --- a/GetStoreApp/Helpers/Controls/Store/QueryLinksHelper.cs +++ b/GetStoreApp/Helpers/Controls/Store/QueryLinksHelper.cs @@ -351,7 +351,7 @@ public static List GetAppxPackages(string fileListXml, string r string revisionNumber = xmlNode.GetElementsByName("UpdateIdentity").Attributes.GetNamedItem("RevisionNumber").InnerText; string updateID = xmlNode.GetElementsByName("UpdateIdentity").Attributes.GetNamedItem("UpdateID").InnerText; string uri = await GetAppxUrlAsync(updateID, revisionNumber, ring, digest); - string fileSizeString = FileSizeHelper.ConvertFileSizeToString(double.TryParse(fileSize, out double size) == true ? size : 0); + string fileSizeString = FileSizeHelper.ConvertFileSizeToString(double.TryParse(fileSize, out double size) ? size : 0); appxPackagesLock.Enter(); @@ -530,9 +530,9 @@ public static async Task> GetNonAppxPackagesAsync(string p string installerType = installerObject.GetNamedString("InstallerType"); string installerUrl = installerObject.GetNamedString("InstallerUrl"); string fileSize = await GetNonAppxPackageFileSizeAsync(installerUrl); - string fileSizeString = FileSizeHelper.ConvertFileSizeToString(double.TryParse(fileSize, out double size) == true ? size : 0); + string fileSizeString = FileSizeHelper.ConvertFileSizeToString(double.TryParse(fileSize, out double size) ? size : 0); - if (Equals(installerType, string.Empty) || installerUrl.ToLower().EndsWith(".exe") || installerUrl.ToLower().EndsWith(".msi")) + if (string.IsNullOrEmpty(installerType) || installerUrl.ToLower().EndsWith(".exe") || installerUrl.ToLower().EndsWith(".msi")) { nonAppxPackagesLock.Enter(); diff --git a/GetStoreApp/Helpers/Root/ProcessHelper.cs b/GetStoreApp/Helpers/Root/ProcessHelper.cs index c06a20b62..c646e4142 100644 --- a/GetStoreApp/Helpers/Root/ProcessHelper.cs +++ b/GetStoreApp/Helpers/Root/ProcessHelper.cs @@ -1,6 +1,5 @@ using GetStoreApp.Services.Root; using GetStoreApp.WindowsAPI.PInvoke.Kernel32; -using GetStoreApp.WindowsAPI.PInvoke.User32; using System; using System.Collections.Generic; using Windows.Foundation.Diagnostics; @@ -54,40 +53,5 @@ public static unsafe List GetProcessPidByName(string processName) return processEntry32PIDList; } } - - /// - /// 创建进程 - /// - public static unsafe void StartProcess(string processName, string arguments, out int processid) - { - Kernel32Library.GetStartupInfo(out STARTUPINFO startupInfo); - startupInfo.lpReserved = IntPtr.Zero; - startupInfo.lpDesktop = IntPtr.Zero; - startupInfo.lpTitle = IntPtr.Zero; - startupInfo.dwX = 0; - startupInfo.dwY = 0; - startupInfo.dwXSize = 0; - startupInfo.dwYSize = 0; - startupInfo.dwXCountChars = 500; - startupInfo.dwYCountChars = 500; - startupInfo.dwFlags = STARTF.STARTF_USESHOWWINDOW; - startupInfo.wShowWindow = WindowShowStyle.SW_SHOWNORMAL; - startupInfo.cbReserved2 = 0; - startupInfo.lpReserved2 = IntPtr.Zero; - startupInfo.cb = sizeof(STARTUPINFO); - - bool createResult = Kernel32Library.CreateProcess(null, string.Join(' ', new string[] { processName, arguments }), IntPtr.Zero, IntPtr.Zero, false, CREATE_PROCESS_FLAGS.None, IntPtr.Zero, null, ref startupInfo, out PROCESS_INFORMATION processInformation); - - if (createResult) - { - if (processInformation.hProcess != IntPtr.Zero) Kernel32Library.CloseHandle(processInformation.hProcess); - if (processInformation.hThread != IntPtr.Zero) Kernel32Library.CloseHandle(processInformation.hThread); - processid = processInformation.dwProcessId; - } - else - { - processid = 0; - } - } } } diff --git a/GetStoreApp/Helpers/Root/RuntimeHelper.cs b/GetStoreApp/Helpers/Root/RuntimeHelper.cs index 0f627db70..01511a144 100644 --- a/GetStoreApp/Helpers/Root/RuntimeHelper.cs +++ b/GetStoreApp/Helpers/Root/RuntimeHelper.cs @@ -61,7 +61,7 @@ private static void IsRunningElevated() } } - IsElevated = token_elevation_type == TOKEN_ELEVATION_TYPE.TokenElevationTypeFull; + IsElevated = token_elevation_type is TOKEN_ELEVATION_TYPE.TokenElevationTypeFull; } } } diff --git a/GetStoreApp/Properties/AssemblyInfo.cs b/GetStoreApp/Properties/AssemblyInfo.cs index e56dcbc12..13d05bad9 100644 --- a/GetStoreApp/Properties/AssemblyInfo.cs +++ b/GetStoreApp/Properties/AssemblyInfo.cs @@ -7,11 +7,11 @@ [assembly: AssemblyCompany("高怡飞")] [assembly: AssemblyCopyright("Copyright ©2022-2024 高怡飞, All Rights Reserved.")] [assembly: AssemblyDescription("获取商店应用")] -[assembly: AssemblyFileVersion("4.6.902.0")] -[assembly: AssemblyInformationalVersion("4.6.902.0")] +[assembly: AssemblyFileVersion("4.6.904.0")] +[assembly: AssemblyInformationalVersion("4.6.904.0")] [assembly: AssemblyProduct("获取商店应用")] [assembly: AssemblyTitle("获取商店应用")] -[assembly: AssemblyVersion("4.6.902.0")] +[assembly: AssemblyVersion("4.6.904.0")] // 应用程序默认区域性的资源控制器设置 [assembly: NeutralResourcesLanguage("en-us")] diff --git a/GetStoreApp/Services/Root/ToastNotificationService.cs b/GetStoreApp/Services/Root/ToastNotificationService.cs index 500d60546..f53d13479 100644 --- a/GetStoreApp/Services/Root/ToastNotificationService.cs +++ b/GetStoreApp/Services/Root/ToastNotificationService.cs @@ -1,8 +1,9 @@ using GetStoreApp.Extensions.DataType.Enums; -using GetStoreApp.Helpers.Root; using GetStoreApp.Services.Controls.Settings; using GetStoreApp.Views.Pages; using GetStoreApp.Views.Windows; +using GetStoreApp.WindowsAPI.PInvoke.Shell32; +using GetStoreApp.WindowsAPI.PInvoke.User32; using Microsoft.UI.Xaml; using System; using System.IO; @@ -58,7 +59,7 @@ public static async Task HandleToastNotificationAsync(string content) if (splitList.Length > 1) { string appId = splitList[1]; - ProcessHelper.StartProcess("winget.exe", string.Format("install {0}", appId), out _); + Shell32Library.ShellExecute(IntPtr.Zero, "open", "winget.exe", string.Format("install {0}", appId), null, WindowShowStyle.SW_SHOWNORMAL); } Program.IsNeedAppLaunch = Application.Current is not null; } diff --git a/GetStoreApp/UI/Controls/Download/CompletedControl.xaml.cs b/GetStoreApp/UI/Controls/Download/CompletedControl.xaml.cs index 766c18c62..b7e391d72 100644 --- a/GetStoreApp/UI/Controls/Download/CompletedControl.xaml.cs +++ b/GetStoreApp/UI/Controls/Download/CompletedControl.xaml.cs @@ -9,6 +9,8 @@ using GetStoreApp.UI.Dialogs.Download; using GetStoreApp.UI.TeachingTips; using GetStoreApp.Views.Windows; +using GetStoreApp.WindowsAPI.PInvoke.Shell32; +using GetStoreApp.WindowsAPI.PInvoke.User32; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Input; @@ -201,7 +203,7 @@ await Task.Run(async () => // 普通应用:直接安装 if (completedItem.FilePath.EndsWith(".exe") || completedItem.FileName.EndsWith(".msi")) { - ProcessHelper.StartProcess("explorer.exe ", completedItem.FilePath, out _); + Shell32Library.ShellExecute(IntPtr.Zero, "open", completedItem.FilePath, string.Empty, null, WindowShowStyle.SW_SHOWNORMAL); } // 商店打包应用:使用应用安装程序安装或直接安装 else diff --git a/GetStoreApp/UI/Controls/WinGet/InstalledAppsControl.xaml.cs b/GetStoreApp/UI/Controls/WinGet/InstalledAppsControl.xaml.cs index 249c5cf43..8644dafdb 100644 --- a/GetStoreApp/UI/Controls/WinGet/InstalledAppsControl.xaml.cs +++ b/GetStoreApp/UI/Controls/WinGet/InstalledAppsControl.xaml.cs @@ -5,6 +5,8 @@ using GetStoreApp.Services.Root; using GetStoreApp.UI.Dialogs.WinGet; using GetStoreApp.UI.TeachingTips; +using GetStoreApp.WindowsAPI.PInvoke.Shell32; +using GetStoreApp.WindowsAPI.PInvoke.User32; using Microsoft.Management.Deployment; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; @@ -193,7 +195,7 @@ private void OnUnInstallExecuteRequested(XamlUICommand sender, ExecuteRequestedE if (result is ContentDialogResult.Primary) { - ProcessHelper.StartProcess(Path.Combine(InfoHelper.SystemDataPath.Windows, "System32", "Shutdown.exe"), "-r -t 120", out _); + Shell32Library.ShellExecute(IntPtr.Zero, "open", Path.Combine(InfoHelper.SystemDataPath.Windows, "System32", "Shutdown.exe"), "-r -t 120", null, WindowShowStyle.SW_SHOWNORMAL); } } @@ -291,7 +293,7 @@ private void OnTextChanged(object sender, AutoSuggestBoxTextChangedEventArgs arg if (sender is AutoSuggestBox autoSuggestBox) { SearchText = autoSuggestBox.Text; - if (SearchText == string.Empty && MatchResultList.Count > 0) + if (string.IsNullOrEmpty(SearchText) && MatchResultList.Count > 0) { InitializeData(); } @@ -322,7 +324,7 @@ private void GetInstalledApps() for (int index = 0; index < list.Count; index++) { MatchResult matchResultItem = list[index]; - if (matchResultItem.CatalogPackage.InstalledVersion.Publisher != string.Empty) + if (!string.IsNullOrEmpty(matchResultItem.CatalogPackage.InstalledVersion.Publisher)) { MatchResultList.Add(matchResultItem); } diff --git a/GetStoreApp/UI/Controls/WinGet/SearchAppsControl.xaml.cs b/GetStoreApp/UI/Controls/WinGet/SearchAppsControl.xaml.cs index 8ec42a8b6..f6b0cb584 100644 --- a/GetStoreApp/UI/Controls/WinGet/SearchAppsControl.xaml.cs +++ b/GetStoreApp/UI/Controls/WinGet/SearchAppsControl.xaml.cs @@ -7,6 +7,8 @@ using GetStoreApp.UI.Dialogs.WinGet; using GetStoreApp.UI.TeachingTips; using GetStoreApp.Views.Pages; +using GetStoreApp.WindowsAPI.PInvoke.Shell32; +using GetStoreApp.WindowsAPI.PInvoke.User32; using Microsoft.Management.Deployment; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; @@ -299,7 +301,7 @@ private void OnInstallExecuteRequested(XamlUICommand sender, ExecuteRequestedEve if (result is ContentDialogResult.Primary) { - ProcessHelper.StartProcess(Path.Combine(InfoHelper.SystemDataPath.Windows, "System32", "Shutdown.exe"), "-r -t 120", out _); + Shell32Library.ShellExecute(IntPtr.Zero, "open", Path.Combine(InfoHelper.SystemDataPath.Windows, "System32", "Shutdown.exe"), "-r -t 120", null, WindowShowStyle.SW_SHOWNORMAL); } } } @@ -419,7 +421,7 @@ private void OnInstallWithCmdExecuteRequested(XamlUICommand sender, ExecuteReque { Task.Run(() => { - ProcessHelper.StartProcess("winget.exe", string.Format("install {0}", appId), out _); + Shell32Library.ShellExecute(IntPtr.Zero, "open", "winget.exe", string.Format("install {0}", appId), null, WindowShowStyle.SW_SHOWNORMAL); }); } } diff --git a/GetStoreApp/UI/Controls/WinGet/UpgradableAppsControl.xaml.cs b/GetStoreApp/UI/Controls/WinGet/UpgradableAppsControl.xaml.cs index 201d500fe..c39233719 100644 --- a/GetStoreApp/UI/Controls/WinGet/UpgradableAppsControl.xaml.cs +++ b/GetStoreApp/UI/Controls/WinGet/UpgradableAppsControl.xaml.cs @@ -7,6 +7,8 @@ using GetStoreApp.UI.Dialogs.WinGet; using GetStoreApp.UI.TeachingTips; using GetStoreApp.Views.Pages; +using GetStoreApp.WindowsAPI.PInvoke.Shell32; +using GetStoreApp.WindowsAPI.PInvoke.User32; using Microsoft.Management.Deployment; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; @@ -117,7 +119,7 @@ private void OnInstallWithCmdExecuteRequested(XamlUICommand sender, ExecuteReque { Task.Run(() => { - ProcessHelper.StartProcess("winget.exe", string.Format("install {0}", appId), out _); + Shell32Library.ShellExecute(IntPtr.Zero, "open", "winget.exe", string.Format("install {0}", appId), null, WindowShowStyle.SW_SHOWNORMAL); }); } } @@ -299,7 +301,7 @@ private void OnUpdateExecuteRequested(XamlUICommand sender, ExecuteRequestedEven if (result is ContentDialogResult.Primary) { - ProcessHelper.StartProcess(Path.Combine(InfoHelper.SystemDataPath.Windows, "System32", "Shutdown.exe"), "-r -t 120", out _); + Shell32Library.ShellExecute(IntPtr.Zero, "open", Path.Combine(InfoHelper.SystemDataPath.Windows, "System32", "Shutdown.exe"), "-r -t 120", null, WindowShowStyle.SW_SHOWNORMAL); } } diff --git a/GetStoreApp/Views/Pages/AppManagerPage.xaml.cs b/GetStoreApp/Views/Pages/AppManagerPage.xaml.cs index ba8a7e7ca..550b3ef12 100644 --- a/GetStoreApp/Views/Pages/AppManagerPage.xaml.cs +++ b/GetStoreApp/Views/Pages/AppManagerPage.xaml.cs @@ -1189,9 +1189,8 @@ private void OnTextChanged(object sender, AutoSuggestBoxTextChangedEventArgs arg if (sender is AutoSuggestBox autoSuggestBox) { SearchText = autoSuggestBox.Text; - if (SearchText.Equals(string.Empty)) + if (string.IsNullOrEmpty(SearchText)) { - SearchText = string.Empty; InitializeData(); } } diff --git a/GetStoreApp/Views/Pages/AppUpdatePage.xaml.cs b/GetStoreApp/Views/Pages/AppUpdatePage.xaml.cs index 4a52f0d88..778b92bcd 100644 --- a/GetStoreApp/Views/Pages/AppUpdatePage.xaml.cs +++ b/GetStoreApp/Views/Pages/AppUpdatePage.xaml.cs @@ -312,7 +312,7 @@ private void OnUpdateAllClicked(object sender, RoutedEventArgs args) { AppInstallItem appInstallItem = await appInstallManager.UpdateAppByPackageFamilyNameAsync(appUpdateItem.PackageFamilyName); - if (appInstallItem != null && !AppInstallingDict.ContainsKey(appInstallItem.PackageFamilyName)) + if (appInstallItem is not null && !AppInstallingDict.ContainsKey(appInstallItem.PackageFamilyName)) { appInstallItem.Completed += OnAppInstallItemCompleted; appInstallItem.StatusChanged += OnAppInstallItemStatausChanged; diff --git a/GetStoreApp/Views/Pages/SettingsPage.xaml.cs b/GetStoreApp/Views/Pages/SettingsPage.xaml.cs index be94cc9b0..3232ecb37 100644 --- a/GetStoreApp/Views/Pages/SettingsPage.xaml.cs +++ b/GetStoreApp/Views/Pages/SettingsPage.xaml.cs @@ -8,6 +8,8 @@ using GetStoreApp.UI.TeachingTips; using GetStoreApp.Views.Windows; using GetStoreApp.WindowsAPI.ComTypes; +using GetStoreApp.WindowsAPI.PInvoke.Shell32; +using GetStoreApp.WindowsAPI.PInvoke.User32; using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.UI.Xaml.Input; @@ -517,7 +519,7 @@ private void OnOpenWinGetSettingsClicked(object sender, RoutedEventArgs args) } else { - ProcessHelper.StartProcess("winget.exe", "settings", out _); + Shell32Library.ShellExecute(IntPtr.Zero, "open", "winget.exe", "settings", null, WindowShowStyle.SW_HIDE); } } }); diff --git a/GetStoreApp/Views/Windows/MainWindow.xaml.cs b/GetStoreApp/Views/Windows/MainWindow.xaml.cs index 100b4575d..d1c3c6f03 100644 --- a/GetStoreApp/Views/Windows/MainWindow.xaml.cs +++ b/GetStoreApp/Views/Windows/MainWindow.xaml.cs @@ -1059,7 +1059,7 @@ private void CheckNetwork() try { ConnectionProfile connectionProfile = NetworkInformation.GetInternetConnectionProfile(); - bool isConnected = connectionProfile != null && connectionProfile.GetNetworkConnectivityLevel() is NetworkConnectivityLevel.InternetAccess; + bool isConnected = connectionProfile is not null && connectionProfile.GetNetworkConnectivityLevel() is NetworkConnectivityLevel.InternetAccess; if (!isConnected) { diff --git a/GetStoreApp/WindowsAPI/PInvoke/Kernel32/CREATE_PROCESS_FLAGS.cs b/GetStoreApp/WindowsAPI/PInvoke/Kernel32/CREATE_PROCESS_FLAGS.cs deleted file mode 100644 index 166205748..000000000 --- a/GetStoreApp/WindowsAPI/PInvoke/Kernel32/CREATE_PROCESS_FLAGS.cs +++ /dev/null @@ -1,117 +0,0 @@ -using System; - -namespace GetStoreApp.WindowsAPI.PInvoke.Kernel32 -{ - /// - /// 进程创建标志 - /// CreateProcess、CreateProcessAsUser、CreateProcessWithLogonW 和 CreateProcessWithTokenW - /// 函数使用以下进程创建标志。 可以在任意组合中指定它们, - /// - [Flags] - public enum CREATE_PROCESS_FLAGS : uint - { - /// - /// 无任何标志 - /// - None = 0x0, - - /// - /// 与作业关联的进程的子进程不与作业相关联。 - /// 如果调用进程未与作业关联,则此常量不起作用。 如果调用进程与作业相关联,则作业必须设置 JOB_OBJECT_LIMIT_BREAKAWAY_OK 限制。 - /// - CREATE_BREAKAWAY_FROM_JOB = 0x01000000, - - /// - /// 新进程不会继承调用进程的错误模式。 相反,新进程会获取默认错误模式。 - /// 此功能对于禁用硬错误的多线程 shell 应用程序尤其有用。 - /// 默认行为是让新进程继承调用方的错误模式。 设置此标志会更改默认行为。 - /// - CREATE_DEFAULT_ERROR_MODE = 0x04000000, - - /// - /// 新进程具有新控制台,而不是继承其父控制台, (默认) 。 有关详细信息,请参阅 “创建控制台”。 - /// 此标志不能与 DETACHED_PROCESS一起使用。 - /// - CREATE_NEW_CONSOLE = 0x00000010, - - /// - /// 新进程是新进程组的根进程。 进程组包括此根进程的子代的所有进程。 新进程组的进程标识符与进程标识符相同,该标识符在 lpProcessInformation 参数中返回。 GenerateConsoleCtrlEvent 函数使用进程组,以便向一组控制台进程发送 CTRL+BREAK 信号。 - /// 如果指定此标志,将为新进程组中的所有进程禁用 CTRL+C 信号。 - /// 如果使用 CREATE_NEW_CONSOLE 指定,则忽略此标志。 - /// - CREATE_NEW_PROCESS_GROUP = 0x00000200, - - /// - /// 此过程是一个在没有控制台窗口的情况下运行的控制台应用程序。 因此,未设置应用程序的控制台句柄。 - /// T如果应用程序不是控制台应用程序,或者将其与 CREATE_NEW_CONSOLE 或 DETACHED_PROCESS 一起使用,则忽略此标志。 - /// - CREATE_NO_WINDOW = 0x08000000, - - /// - /// 进程将作为受保护的进程运行。 系统限制对受保护进程和受保护进程的线程的访问。 有关如何与受保护进程交互的详细信息,请参阅 进程安全性和访问权限。 - /// 若要激活受保护的进程,二进制文件必须具有特殊的签名。 此签名由 Microsoft 提供,但目前不适用于非 Microsoft 二进制文件。 目前有四个受保护的进程:媒体基础、音频引擎、Windows错误报告和系统。 还必须对加载到这些二进制文件的组件进行签名。 多媒体公司可以利用前两个受保护的流程。 有关详细信息,请参阅 受保护的媒体路径概述。 - /// Windows Server 2003 和 Windows XP:不支持此值。 - /// - CREATE_PROTECTED_PROCESS = 0x00040000, - - /// - /// 允许调用方执行绕过通常自动应用于进程的进程限制的子进程。 - /// - CREATE_PRESERVE_CODE_AUTHZ_LEVEL = 0x02000000, - - /// - /// 此标志允许在Virtualization-Based安全环境中运行的安全进程启动。 - /// - CREATE_SECURE_PROCESS = 0x00400000, - - /// - /// 仅当启动基于 16 位Windows的应用程序时,此标志才有效。 如果已设置,新进程将在专用虚拟 DOS 计算机中运行 (VDM) 。 默认情况下,所有基于 16 位Windows的应用程序在单个共享 VDM 中作为线程运行。 单独运行的优点是,崩溃只会终止单个 VDM;在不同 VM 中运行的任何其他程序将继续正常运行。 此外,在单独的 VM 中运行的基于 16 位Windows的应用程序具有单独的输入队列。 这意味着,如果一个应用程序暂时停止响应,则单独的 VM 中的应用程序将继续接收输入。 单独运行的缺点是,需要更多内存才能执行此操作。 仅当用户请求 16 位应用程序应在自己的 VDM 中运行时,才应使用此标志。 - /// - CREATE_SEPARATE_WOW_VDM = 0x00000800, - - /// - /// 仅当启动基于 16 位Windows的应用程序时,标志才有效。 如果 WIN.INI Windows 部分中的 DefaultSeparateVDM 开关为 TRUE,则此标志将替代该开关。 新进程在共享虚拟 DOS 计算机中运行。 - /// - CREATE_SHARED_WOW_VDM = 0x00001000, - - /// - /// 新进程的主线程处于挂起状态创建,在调用 ResumeThread 函数之前不会运行。 - /// - CREATE_SUSPENDED = 0x00000004, - - /// - /// 如果设置了此标志, 则 lpEnvironment 指向的环境块使用 Unicode 字符。 否则,环境块使用 ANSI 字符。 - /// - CREATE_UNICODE_ENVIRONMENT = 0x00000400, - - /// - /// 调用线程启动并调试新进程。 它可以使用 WaitForDebugEvent 函数接收所有相关的调试事件。 - /// - DEBUG_ONLY_THIS_PROCESS = 0x00000002, - - /// - /// 调用线程启动并调试由新进程创建的新进程和所有子进程。 它可以使用 WaitForDebugEvent 函数接收所有相关的调试事件。 - /// 使用 DEBUG_PROCESS 的进程将成为调试链的根目录。 这一点一直持续到链中的另一个进程通过 DEBUG_PROCESS 创建。 - /// 如果此标志与 DEBUG_ONLY_THIS_PROCESS 结合使用,则调用方仅调试新进程,而不调试任何子进程。 - /// - DEBUG_PROCESS = 0x00000001, - - /// - /// 对于控制台进程,新进程不会 (默认) 继承其父级的控制台。 新进程稍后可以调用 AllocConsole 函数来创建控制台。 有关详细信息,请参阅 “创建控制台”。 - /// 此值不能与 CREATE_NEW_CONSOLE 一起使用。 - /// - DETACHED_PROCESS = 0x00000008, - - /// - /// 此过程是使用扩展的启动信息创建的; lpStartupInfo 参数指定 STARTUPINFOEX 结构。 - /// Windows Server 2003 和 Windows XP:不支持此值。 - /// - EXTENDED_STARTUPINFO_PRESENT = 0x00080000, - - /// - /// 进程继承其父级的相关性。 如果父进程具有多个 处理器组中的线程,新进程将继承父组使用的任意组的组相对相关性。 - /// Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP:不支持此值。 - /// - INHERIT_PARENT_AFFINITY = 0x00010000 - } -} diff --git a/GetStoreApp/WindowsAPI/PInvoke/Kernel32/EDesiredAccess.cs b/GetStoreApp/WindowsAPI/PInvoke/Kernel32/EDesiredAccess.cs deleted file mode 100644 index 3863ae445..000000000 --- a/GetStoreApp/WindowsAPI/PInvoke/Kernel32/EDesiredAccess.cs +++ /dev/null @@ -1,103 +0,0 @@ -namespace GetStoreApp.WindowsAPI.PInvoke.Kernel32 -{ - /// - /// 进程对象的访问权限 - /// - public enum EDESIREDACCESS : uint - { - /// - /// 删除对象所必需的。 - /// - DELETE = 0x00010000, - - /// - /// 需要读取对象的安全描述符中的信息,而不包括 SACL 中的信息。 若要读取或写入 SACL,必须请求 ACCESS_SYSTEM_SECURITY 访问权限。 - /// - READ_CONTROL = 0x00020000, - - /// - /// 在对象的安全描述符中修改 DACL 是必需的。 - /// - WRITE_DAC = 0x00040000, - - /// - /// 在对象的安全描述符中更改所有者所必需的。 - /// - WRITE_OWNER = 0x00080000, - - /// - /// 将对象用于同步的权限。 这使线程可以等待对象处于信号状态。 - /// - SYNCHRONIZE = 0x00100000, - - /// - /// 需要使用 TerminateProcess 终止进程。 - /// - PROCESS_TERMINATE = 0x0001, - - /// - /// 在进程中创建线程所必需的。 - /// - PROCESS_CREATE_THREAD = 0x0002, - - /// - /// 在进程中设置进程会话 - /// - PROCESS_SET_SESSIONID = 0x0004, - - /// - /// 在进程地址空间上执行操作 - /// - PROCESS_VM_OPERATION = 0x0008, - - /// - /// 需要使用 ReadProcessMemory 读取进程中的内存。 - /// - PROCESS_VM_READ = 0x0010, - - /// - /// 需要使用 WriteProcessMemory 写入进程中的内存。 - /// - PROCESS_VM_WRITE = 0x0020, - - /// - /// 需要使用 DuplicateHandle 复制句柄。 - /// - PROCESS_DUP_HANDLE = 0x0040, - - /// - /// 需要使用此过程作为父进程和 PROC_THREAD_ATTRIBUTE_PARENT_PROCESS。 - /// - PROCESS_CREATE_PROCESS = 0x0080, - - /// - /// 需要使用 SetProcessWorkingSetSize 设置内存限制。 - /// - PROCESS_SET_QUOTA = 0x0100, - - /// - /// 设置有关进程的某些信息 - /// - PROCESS_SET_INFORMATION = 0x0200, - - /// - /// 检索有关进程的某些信息 - /// - PROCESS_QUERY_INFORMATION = 0x0400, - - /// - /// 暂停或恢复进程所必需的。 - /// - PROCESS_SUSPEND_RESUME = 0x0800, - - /// - /// 检索有关进程的某些信息需要。 PROCESS_QUERY_LIMITED_INFORMATION 自动授予具有 PROCESS_QUERY_INFORMATION 访问权限的句柄。 - /// - PROCESS_QUERY_LIMITED_INFORMATION = 0x1000, - - /// - /// 进程对象的所有可能访问权限。 - /// - PROCESS_ALL_ACCESS = SYNCHRONIZE | 0xFFF - } -} diff --git a/GetStoreApp/WindowsAPI/PInvoke/Kernel32/Kernel32Library.cs b/GetStoreApp/WindowsAPI/PInvoke/Kernel32/Kernel32Library.cs index 44f666305..bc655cc6b 100644 --- a/GetStoreApp/WindowsAPI/PInvoke/Kernel32/Kernel32Library.cs +++ b/GetStoreApp/WindowsAPI/PInvoke/Kernel32/Kernel32Library.cs @@ -66,77 +66,6 @@ public static partial class Kernel32Library [LibraryImport(Kernel32, EntryPoint = "CreateToolhelp32Snapshot", SetLastError = false), PreserveSig] public static partial IntPtr CreateToolhelp32Snapshot(CREATE_TOOLHELP32_SNAPSHOT_FLAGS dwFlags, uint th32ProcessID); - /// - /// 创建新进程及其主线程。 新进程在调用进程的安全上下文中运行。 - /// 如果调用进程正在模拟其他用户,则新进程将令牌用于调用进程,而不是模拟令牌。 若要在模拟令牌表示的用户的安全上下文中运行新进程,请使用 CreateProcessAsUser 或 CreateProcessWithLogonW 函数。 - /// - /// - /// 要执行的模块的名称。 此模块可以是基于 Windows 的应用程序。 它可以是某种其他类型的模块 (例如 MS-DOS 或 OS/2) (如果本地计算机上提供了相应的子系统)。 - /// 字符串可以指定要执行的模块的完整路径和文件名,也可以指定部分名称。 对于部分名称,函数使用当前驱动器和当前目录来完成规范。 函数不会使用搜索路径。 此参数必须包含文件扩展名;不采用默认扩展名。 - /// 参数可以为 NULL。 在这种情况下,模块名称必须是 lpCommandLine 字符串中第一个空格分隔的标记。 如果使用包含空格的长文件名,请使用带引号的字符串来指示文件名结束和参数开始的位置;否则,文件名不明确。 - /// 如果可执行模块是 16 位应用程序, lpApplicationName 应为 NULL, lpCommandLine 指向的字符串应指定可执行模块及其参数。 - /// 若要运行批处理文件,必须启动命令解释器;将 lpApplicationName 设置为 cmd.exe 并将 lpCommandLine 设置为以下参数:/c 加上批处理文件的名称。 - /// - /// - /// 要执行的命令行。 - /// 此字符串的最大长度为 32,767 个字符,包括 Unicode 终止 null 字符。 如果 lpApplicationName 为 NULL,则 lpCommandLine 的模块名称部分限制为 MAX_PATH 个字符。 - /// 此函数的 Unicode 版本 CreateProcessW 可以修改此字符串的内容。 因此,此参数不能是指向只读内存(的指针,例如 const 变量或文本字符串) 。 如果此参数是常量字符串,该函数可能会导致访问冲突。 - /// 参数可以为 NULL。 在这种情况下,函数使用 lpApplicationName 指向的字符串作为命令行。 - /// 如果 lpApplicationName 和 lpCommandLine 均为非 NULL,则 lpApplicationName 指向的以 null 结尾的字符串将指定要执行的模块, 而 lpCommandLine 指向的以 null 结尾的字符串将指定命令行。 新进程可以使用 GetCommandLine 检索整个命令行。 用 C 编写的控制台进程可以使用 argc 和 argv 参数来分析命令行。 由于 argv[0] 是模块名称,因此 C 程序员通常将模块名称重复为命令行中的第一个标记。 - /// 如果 lpApplicationName 为 NULL,则命令行的第一个空格分隔标记将指定模块名称。 如果使用包含空格的长文件名,请使用带引号的字符串来指示文件名结束和参数开始的位置 (请参阅 lpApplicationName 参数) 的说明。 如果文件名不包含扩展名,则追加.exe。 因此,如果文件扩展名为 .com,则此参数必须包含 .com 扩展名。 如果文件名以不带扩展名的句点 (.) 结尾,或者文件名包含路径,则不会追加.exe。 如果文件名不包含目录路径,系统会按以下顺序搜索可执行文件: - /// 1.从中加载应用程序的目录。 - /// 2.父进程的当前目录。 - /// 3.32 位 Windows 系统目录。 使用 GetSystemDirectory 函数获取此目录的路径。 - /// 4.16 位 Windows 系统目录。 没有获取此目录的路径的函数,但会对其进行搜索。 此目录的名称为 System。 - /// 5.Windows 目录。 使用 GetWindowsDirectory 函数获取此目录的路径。 - /// 6.PATH 环境变量中列出的目录。 请注意,此函数不会搜索应用程序路径注册表项指定的每个 应用程序 路径。 若要在搜索序列中包含此每个应用程序的路径,请使用 ShellExecute 函数。 - /// 系统向命令行字符串添加一个终止 null 字符,以将文件名与参数分开。 这会将原始字符串划分为两个字符串以供内部处理。 - /// - /// - /// 指向 SECURITY_ATTRIBUTES 结构的指针,该结构确定返回的新进程对象的句柄是否可以由子进程继承。 如果 lpProcessAttributes 为 NULL,则不能继承句柄。 - /// 结构的 lpSecurityDescriptor 成员为新进程指定安全描述符。 如果 lpProcessAttributes 为 NULL 或 lpSecurityDescriptor 为 NULL,则进程将获取默认安全描述符。 进程的默认安全描述符中的 ACL 来自创建者的主令牌。Windowsxp: 进程的默认安全描述符中的 ACL 来自创建者的主要令牌或模拟令牌。 此行为随 Windows XP SP2 和 Windows Server 2003 更改。 - /// - /// - /// 指向 SECURITY_ATTRIBUTES 结构的指针,该结构确定返回的新线程对象的句柄是否可以由子进程继承。 如果 lpProcessAttributes 为 NULL,则不能继承句柄。 - /// 结构的 lpSecurityDescriptor 成员指定主线程的安全描述符。 如果 lpThreadAttributes 为 NULL 或 lpSecurityDescriptor 为 NULL,则线程获取默认安全描述符。 线程的默认安全描述符中的 ACL 来自进程令牌。Windowsxp: 线程的默认安全描述符中的 ACL 来自创建者的主令牌或模拟令牌。 此行为随 Windows XP SP2 和 Windows Server 2003 更改。 - /// - /// - /// 如果此参数为 TRUE,则调用进程中的每个可继承句柄都由新进程继承。 如果参数为 FALSE,则不继承句柄。 请注意,继承的句柄与原始句柄具有相同的值和访问权限。 有关可继承句柄的其他讨论,请参阅备注。 - /// 终端服务: 不能跨会话继承句柄。 此外,如果此参数为 TRUE,则必须在与调用方相同的会话中创建进程。 - /// 受保护的流程灯(PPL) 进程: 当 PPL 进程创建非 PPL 进程时,将阻止泛型句柄继承,因为不允许将PROCESS_DUP_HANDLE从非 PPL 进程转换为 PPL 进程。 请参阅 进程安全性和访问权限 - /// - /// - /// 控制优先级类和进程的创建的标志。 有关值的列表,请参阅 进程创建标志。 - /// 此参数还控制新进程的优先级类,该类用于确定进程线程的计划优先级。 有关值的列表,请参阅 GetPriorityClass。 如果未指定任何优先级类标志,则优先级类默认为 NORMAL_PRIORITY_CLASS ,除非创建过程的优先级类 IDLE_PRIORITY_CLASS 或 BELOW_NORMAL_PRIORITY_CLASS。 在这种情况下,子进程接收调用进程的默认优先级类。 - /// 如果 dwCreationFlags 参数的值为 0: - /// 1.进程同时继承调用方和父级控制台的错误模式。 - /// 2.假定新进程的环境块包含 ANSI 字符(请参阅 lpEnvironment 参数以获取) 的其他信息。 - /// 3.基于 16 位 Windows 的应用程序在共享的虚拟 DOS 计算机中运行, (VDM) 。 - /// - /// - /// 指向新进程的环境块的指针。 如果此参数为 NULL,则新进程使用调用进程的 环境。环境块由以 null 结尾的字符串的以 null 结尾的块组成。 - /// 每个字符串采用以下格式:名字=value\0 - /// 由于等号用作分隔符,因此不得在环境变量的名称中使用。环境块可以包含 Unicode 或 ANSI 字符。 如果 lpEnvironment 指向的环境块包含 Unicode 字符,请确保 dwCreationFlags 包含 CREATE_UNICODE_ENVIRONMENT。如果进程的环境块的总大小超过 32,767 个字符,则此函数的 ANSI 版本 CreateProcessA 将失败。 - /// 请注意,ANSI 环境块以两个零字节结尾:一个字节用于最后一个字符串,另一个用于终止该块。 Unicode 环境块以四个零字节结尾:两个作为最后一个字符串,另外两个用于终止该块。 - /// - /// - /// 进程当前目录的完整路径。 字符串还可以指定 UNC 路径。如果此参数为 NULL,则新进程将具有与调用进程相同的当前驱动器和目录。 (此功能主要用于需要启动应用程序并指定其初始驱动器和工作目录的 shell。) - /// - /// - /// 指向 STARTUPINFO 或 STARTUPINFOEX 结构的指针。若要设置扩展属性,请使用 STARTUPINFOEX 结构并在 dwCreationFlags 参数中指定 EXTENDED_STARTUPINFO_PRESENT。当不再需要 STARTUPINFO 或 STARTUPINFOEX 中的句柄时,必须使用 CloseHandle 关闭它们。 - /// 调用方负责确保 STARTUPINFO 中的标准句柄字段包含有效的句柄值。 即使 dwFlags 成员指定了 STARTF_USESTDHANDLES,这些字段也保持不变地复制到子进程,而无需验证。 不正确的值可能导致子进程行为不端或崩溃。 使用应用程序验证程序运行时验证工具检测无效句柄。 - /// - /// - /// 指向 PROCESS_INFORMATION 结构的指针,该结构接收有关新进程的标识信息。当不再需要 PROCESS_INFORMATION 中的句柄时,必须使用 CloseHandle 将其关闭。 - /// - /// - /// 如果该函数成功,则返回值为非零值。如果函数失败,则返回值为零。 - /// 请注意,函数在进程完成初始化之前返回 。 如果找不到所需的 DLL 或无法初始化,则进程将终止。 若要获取进程的终止状态,请调用 GetExitCodeProcess。 - /// - [LibraryImport(Kernel32, EntryPoint = "CreateProcessW", SetLastError = false, StringMarshalling = StringMarshalling.Utf16), PreserveSig] - [return: MarshalAs(UnmanagedType.Bool)] - public static partial bool CreateProcess([MarshalAs(UnmanagedType.LPWStr)] string lpApplicationName, [MarshalAs(UnmanagedType.LPWStr)] string lpCommandLine, IntPtr lpProcessAttributes, IntPtr lpThreadAttributes, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandles, CREATE_PROCESS_FLAGS dwCreationFlags, IntPtr lpEnvironment, [MarshalAs(UnmanagedType.LPWStr)] string lpCurrentDirectory, ref STARTUPINFO lpStartupInfo, out PROCESS_INFORMATION lpProcessInformation); - /// /// 从其控制台中分离调用进程。 /// @@ -145,13 +74,6 @@ public static partial class Kernel32Library [return: MarshalAs(UnmanagedType.Bool)] public static partial bool FreeConsole(); - /// - /// 检索创建调用进程时指定的 STARTUPINFO 结构的内容。 - /// - /// 指向接收启动信息的 STARTUPINFO 结构的指针。 - [LibraryImport(Kernel32, EntryPoint = "GetStartupInfoW", SetLastError = false), PreserveSig] - public static partial void GetStartupInfo(out STARTUPINFO lpStartupInfo); - /// /// 检索指定标准设备的句柄(标准输入、标准输出或标准错误)。 /// diff --git a/GetStoreApp/WindowsAPI/PInvoke/Kernel32/PROCESS_INFORMATION.cs b/GetStoreApp/WindowsAPI/PInvoke/Kernel32/PROCESS_INFORMATION.cs deleted file mode 100644 index cd99eab24..000000000 --- a/GetStoreApp/WindowsAPI/PInvoke/Kernel32/PROCESS_INFORMATION.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System; -using System.Runtime.InteropServices; - -namespace GetStoreApp.WindowsAPI.PInvoke.Kernel32 -{ - /// - /// 包含有关新创建的进程及其主线程的信息。 它与 CreateProcess、CreateProcessAsUser、CreateProcessWithLogonW 或 CreateProcessWithTokenW 函数一起使用。 - /// - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] - public struct PROCESS_INFORMATION - { - /// - /// 新创建的进程的句柄。 句柄用于在对进程对象执行操作的所有函数中指定进程。 - /// - public IntPtr hProcess; - - /// - /// 新创建的进程的主线程的句柄。 句柄用于在线程对象上执行操作的所有函数中指定线程。 - /// - public IntPtr hThread; - - /// - /// 可用于标识进程的值。 从创建进程到进程的所有句柄关闭并释放进程对象为止,该值有效;此时,可以重复使用标识符。 - /// - public int dwProcessId; - - /// - /// 可用于标识线程的值。 在线程创建到线程的所有句柄关闭且线程对象释放之前,该值有效;此时,可以重复使用标识符。 - /// - public int dwThreadId; - } -} diff --git a/GetStoreApp/WindowsAPI/PInvoke/Kernel32/SECURITY_ATTRIBUTES.cs b/GetStoreApp/WindowsAPI/PInvoke/Kernel32/SECURITY_ATTRIBUTES.cs deleted file mode 100644 index 228dc0121..000000000 --- a/GetStoreApp/WindowsAPI/PInvoke/Kernel32/SECURITY_ATTRIBUTES.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Runtime.InteropServices; - -namespace GetStoreApp.WindowsAPI.PInvoke.Kernel32 -{ - /// - /// SECURITY_ATTRIBUTES 结构包含对象的安全描述符,并指定通过指定此结构检索的句柄是否可继承。此结构为由各种函数(如 CreateFile、CreatePipe、CreateProcess、RegCreateKeyEx 或 RegSaveKeyEx)创建的对象提供安全设置。 - /// - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] - public struct SECURITY_ATTRIBUTES - { - /// - /// 此结构的大小(以字节为单位)。 - /// 将此值设置为 SECURITY_ATTRIBUTES 结构的大小。 - /// - public int nLength; - - /// - /// 指向控制对对象的访问的SECURITY_DESCRIPTOR结构的指针。如果此成员的值为 NULL,则会为对象分配与调用进程的访问令牌关联的默认安全描述符。这与通过分配 NULL 自由访问控制列表 (DACL) 向每个人授予访问权限不同。默认情况下,进程的访问令牌中的默认 DACL 仅允许访问令牌表示的用户。 - /// - public IntPtr lpSecurityDescriptor; - - /// - /// 一个布尔值,它指定在创建新进程时是否继承返回的句柄。如果此成员为 TRUE,则新进程将继承句柄。 - /// - public int bInheritHandle; - } -} diff --git a/GetStoreApp/WindowsAPI/PInvoke/Kernel32/STARTF.cs b/GetStoreApp/WindowsAPI/PInvoke/Kernel32/STARTF.cs deleted file mode 100644 index c77bb36e6..000000000 --- a/GetStoreApp/WindowsAPI/PInvoke/Kernel32/STARTF.cs +++ /dev/null @@ -1,98 +0,0 @@ -using System; - -namespace GetStoreApp.WindowsAPI.PInvoke.Kernel32 -{ - /// - /// 一个位域,用于确定进程创建窗口时是否使用某些 STARTUPINFO 成员。 - /// - [Flags] - public enum STARTF - { - /// - /// 无标志 - /// - None = 0x0, - - /// - /// 指示在调用 CreateProcessAsUser 后,游标处于反馈模式两秒。 (“鼠标”控制面板实用工具中的“指针”选项卡) 显示“在后台工作”光标。 - /// 如果在这两秒内,进程进行第一次 GUI 调用,则系统会为进程再提供 5 秒。 如果在这五秒内进程显示窗口,则系统会为进程再提供 5 秒的时间以完成该窗口的绘制。 - /// 无论进程是否正在绘制,系统在首次调用 GetMessage 后关闭反馈游标。 - /// - STARTF_FORCEONFEEDBACK = 0x00000040, - - /// - /// 指示在进程启动时,反馈游标被强制关闭。 将显示“普通选择”游标。 - /// - STARTF_FORCEOFFFEEDBACK = 0x00000080, - - /// - /// 指示进程创建的任何窗口都不能固定在任务栏上。 - /// 此标志必须与 STARTF_TITLEISAPPID 结合使用。 - /// - STARTF_PREVENTPINNING = 0x00002000, - - /// - /// 指示进程应在全屏模式下运行,而不是在窗口模式下运行。 - /// 此标志仅适用于在 x86 计算机上运行的控制台应用程序。 - /// - STARTF_RUNFULLSCREEN = 0x00000020, - - /// - /// lpTitle 成员包含 AppUserModelID。 此标识符控制任务栏和 “开始” 菜单显示应用程序的方式,并使它能够与正确的快捷方式和跳转列表相关联。 通常,应用程序将使用 SetCurrentProcessExplicitAppUserModelID 和 GetCurrentProcessExplicitAppUserModelID 函数,而不是设置此标志。 有关详细信息,请参阅 应用程序用户模型 ID。 - /// 如果使用 STARTF_PREVENTPINNING,则无法将应用程序窗口固定到任务栏上。 应用程序使用任何 AppUserModelID 相关的窗口属性仅覆盖该窗口的此设置。 - /// 此标志不能与 STARTF_TITLEISLINKNAME 一起使用。 - /// - STARTF_TITLEISAPPID = 0x00001000, - - /// - /// lpTitle 成员包含用户调用启动此过程的快捷文件 (.lnk) 的路径。 调用指向已启动的应用程序的 .lnk 文件时,通常由 shell 设置此值。 大多数应用程序不需要设置此值。 - /// 此标志不能与 STARTF_TITLEISAPPID 一起使用。 - /// - STARTF_TITLEISLINKNAME = 0x00000800, - - /// - /// 命令行来自不受信任的源。 有关详细信息,请参阅“备注”。 - /// - STARTF_UNTRUSTEDSOURCE = 0x00008000, - - /// - /// dwXCountChars 和 dwYCountChars 员包含其他信息。 - /// - STARTF_USECOUNTCHARS = 0x00000008, - - /// - /// dwFillAttribute 成员包含其他信息。 - /// - STARTF_USEFILLATTRIBUTE = 0x00000010, - - /// - /// hStdInput 成员包含其他信息。 - /// 此标志不能与 STARTF_USESTDHANDLES 一起使用。 - /// - STARTF_USEHOTKEY = 0x00000200, - - /// - /// dwX 和 dwY 成员包含其他信息。 - /// - STARTF_USEPOSITION = 0x00000004, - - /// - /// wShowWindow 成员包含其他信息。 - /// - STARTF_USESHOWWINDOW = 0x00000001, - - /// - /// dwXSize 和 dwYSize 成员包含其他信息。 - /// - STARTF_USESIZE = 0x00000002, - - /// - /// hStdInput, hStdOutput 和 hStdError 成员包含其他信息。 - /// 如果在调用某个进程创建函数时指定此标志,则句柄必须可继承,并且该函数的 bInheritHandles 参数必须设置为 TRUE。 有关详细信息,请参阅 句柄继承。 - /// 如果在调用 GetStartupInfo 函数时指定了此标志,则这些成员是进程创建期间指定的句柄值或 INVALID_HANDLE_VALUE。 - /// 不再需要句柄时,必须使用 CloseHandle 关闭句柄。 - /// 此标志不能与 STARTF_USEHOTKEY 一起使用。 - /// - STARTF_USESTDHANDLES = 0x00000100 - } -} diff --git a/GetStoreApp/WindowsAPI/PInvoke/Kernel32/STARTUPINFO.cs b/GetStoreApp/WindowsAPI/PInvoke/Kernel32/STARTUPINFO.cs deleted file mode 100644 index 59fccfa66..000000000 --- a/GetStoreApp/WindowsAPI/PInvoke/Kernel32/STARTUPINFO.cs +++ /dev/null @@ -1,114 +0,0 @@ -using GetStoreApp.WindowsAPI.PInvoke.User32; -using System; -using System.Runtime.InteropServices; - -namespace GetStoreApp.WindowsAPI.PInvoke.Kernel32 -{ - /// - /// 指定创建时进程的主窗口的窗口工作站、桌面、标准句柄和外观。 - /// - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] - public partial struct STARTUPINFO - { - /// - /// 结构大小(以字节为单位)。 - /// - public int cb; - - /// - /// 保留;必须为 NULL。 - /// - public IntPtr lpReserved; - - /// - /// 桌面的名称,或此过程的桌面和窗口工作站的名称。 字符串中的反斜杠指示字符串包括桌面和窗口工作站名称。有关详细信息,请参阅 与桌面的线程连接。 - /// - public IntPtr lpDesktop; - - /// - /// 对于控制台进程,如果创建新的控制台窗口,则这是标题栏中显示的标题。 如果为 NULL,则可执行文件的名称将改为用作窗口标题。 对于不创建新控制台窗口的 GUI 或控制台进程,此参数必须为 NULL。 - /// - public IntPtr lpTitle; - - /// - /// 如果 dwFlags 指定 STARTF_USEPOSITION,则如果创建新窗口(以像素为单位),则此成员是窗口左上角的 x 偏移量。 否则,将忽略此成员。 - /// 偏移量来自屏幕左上角。 对于 GUI 进程,新进程首次调用 CreateWindowEx 以创建重叠窗口(如果 CreateWindowEx 的 x 参数CW_USEDEFAULT)时,将使用指定的位置。 - /// - public int dwX; - - /// - /// 如果 dwFlags 指定 STARTF_USEPOSITION,则如果创建新窗口(以像素为单位),则此成员是窗口左上角的 y 偏移量。 否则,将忽略此成员。 - /// 偏移量来自屏幕左上角。 对于 GUI 进程,新进程首次调用 CreateWindowEx 以创建重叠窗口(如果 CreateWindowEx 的 y 参数CW_USEDEFAULT)时,将使用指定的位置。 - /// - public int dwY; - - /// - /// 如果 dwFlags 指定 STARTF_USESIZE,则如果创建新窗口(以像素为单位),则此成员是窗口的宽度。 否则,将忽略此成员。 - /// 对于 GUI 进程,这仅在新进程调用 CreateWindowEx 时首次调用 CreateWindow 以创建重叠窗口(如果 CreateWindowEx 的 nWidth 参数CW_USEDEFAULT)。 - /// - public int dwXSize; - - /// - /// 如果 dwFlags 指定 STARTF_USESIZE,则如果创建新窗口(以像素为单位),则此成员是窗口的高度。 否则,将忽略此成员。 - /// 对于 GUI 进程,仅当新进程调用 CreateWindowEx 以创建重叠窗口(如果 CreateWindowEx 的 nHeight 参数CW_USEDEFAULT)时,才使用此方法。 - /// - public int dwYSize; - - /// - /// 如果 dwFlags 指定 STARTF_USECOUNTCHARS,如果在控制台进程中创建了一个新的控制台窗口,则此成员以字符列指定屏幕缓冲区宽度。 否则,将忽略此成员。 - /// - public int dwXCountChars; - - /// - /// 如果 dwFlags 指定 STARTF_USECOUNTCHARS,如果在控制台进程中创建了一个新的控制台窗口,则此成员在字符行中指定屏幕缓冲区高度。 否则,将忽略此成员。 - /// - public int dwYCountChars; - - /// - /// 如果 dwFlags 指定 STARTF_USEFILLATTRIBUTE,则如果控制台应用程序中创建了新的控制台窗口,则此成员是初始文本和背景色。 否则,将忽略此成员。 - /// 此值可以是以下值的任意组合:FOREGROUND_BLUE、FOREGROUND_GREEN、FOREGROUND_RED、FOREGROUND_INTENSITY、BACKGROUND_BLUE、BACKGROUND_GREEN、BACKGROUND_RED和BACKGROUND_INTENSITY。 例如,以下值组合在白色背景上生成红色文本: - /// FOREGROUND_RED| BACKGROUND_RED| BACKGROUND_GREEN| BACKGROUND_BLUE - /// - public uint dwFillAttribute; - - /// - /// 一个位字段,用于确定进程创建窗口时是否使用某些 STARTUPINFO 成员。 此成员可以是以下一个或多个值。 - /// - public STARTF dwFlags; - - /// - /// If dwFlags 指定 STARTF_USESHOWWINDOW, 则此成员可以是在 ShowWindow 函数的 nCmdShow 参数中指定的任何值,但 SW_SHOWDEFAULT 除外。 否则,将忽略此成员。 - /// 对于 GUI 进程,首次调用 ShowWindow 时,将忽略其 nCmdShow 参数 wShowWindow 指定默认值。 在对 ShowWindow 的后续调用中,如果将 ShowWindow 的 nCmdShow 参数设置为 SW_SHOWDEFAULT,将使用 wShowWindow 成员。 - /// - public WindowShowStyle wShowWindow; - - /// - /// 保留供 C 运行时使用;必须为零。 - /// - public ushort cbReserved2; - - /// - /// 保留供 C 运行时使用;必须为 NULL。 - /// - public IntPtr lpReserved2; - - /// - /// 如果 dwFlags 指定 STARTF_USESTDHANDLES, 则此成员是进程的标准输入句柄。 如果未指定 STARTF_USESTDHANDLES,则标准输入的默认值为键盘缓冲区 - /// 如果 dwFlags 指定 STARTF_USEHOTKEY, 则此成员指定一个热键值,该值作为 WM_SETHOTKEY 消息的 wParam 参数发送到拥有该过程的应用程序创建的第一个符合条件的顶级窗口。如果使用 WindowStyle.WS_POPUP 窗口样式创建窗口,则它不符合条件,除非还设置了 WindowStyleEx.WS_EX_APPWINDOW 扩展窗口样式。 有关详细信息,请参阅 CreateWindowEx。 - /// 否则,将忽略此成员。 - /// - public IntPtr hStdInput; - - /// - /// 如果 dwFlags 指定 STARTF_USESTDHANDLES, 则此成员是进程的标准输出句柄。 否则,将忽略此成员,标准输出的默认值为控制台窗口的缓冲区。 - /// 如果进程从任务栏或跳转列表启动,系统将 hStdOutput 设置为包含用于启动进程的任务栏或跳转列表的监视器的句柄。 有关详细信息,请参阅“备注”。 - /// Windows 7、Windows Server 2008 R2、Windows Vista、Windows Server 2008、Windows XP 和 Windows Server 2003: 此行为是在Windows 8和Windows Server 2012中引入的。 - /// - public IntPtr hStdOutput; - - /// - /// 如果 dwFlags 指定 STARTF_USESTDHANDLES, 则此成员是进程的标准错误句柄。 否则,将忽略此成员,标准错误的默认值为控制台窗口的缓冲区。 - /// - public IntPtr hStdError; - } -} diff --git a/GetStoreApp/WindowsAPI/PInvoke/Shell32/Shell32Library.cs b/GetStoreApp/WindowsAPI/PInvoke/Shell32/Shell32Library.cs index 3c1c637b8..4641a7fc0 100644 --- a/GetStoreApp/WindowsAPI/PInvoke/Shell32/Shell32Library.cs +++ b/GetStoreApp/WindowsAPI/PInvoke/Shell32/Shell32Library.cs @@ -1,4 +1,5 @@ -using System; +using GetStoreApp.WindowsAPI.PInvoke.User32; +using System; using System.Runtime.InteropServices; namespace GetStoreApp.WindowsAPI.PInvoke.Shell32 @@ -28,5 +29,18 @@ public static partial class Shell32Library /// 如果此函数成功,则返回 S_OK。 否则,将返回 HRESULT 错误代码。 [LibraryImport(Shell32, EntryPoint = "SHCreateItemFromParsingName", SetLastError = false, StringMarshalling = StringMarshalling.Utf16), PreserveSig] public static partial int SHCreateItemFromParsingName([MarshalAs(UnmanagedType.LPWStr)] string pszPath, IntPtr pbc, ref Guid riid, out IntPtr ppv); + + /// + /// 对指定文件执行操作。 + /// + /// 用于显示 UI 或错误消息的父窗口的句柄。 如果操作未与窗口关联,则此值可以为 NULL 。 + /// 指向以 null 结尾的字符串(在本例中称为 谓词)的指针,指定要执行的操作。 可用谓词集取决于特定的文件或文件夹。 通常,对象的快捷菜单中可用的操作是可用的谓词。 + /// 指向 以 null 结尾的字符串的指针,该字符串指定要对其执行指定谓词的文件或对象。 若要指定 Shell 命名空间对象,请传递完全限定分析名称。 请注意,并非所有对象都支持所有谓词。 例如,并非所有文档类型都支持“print”谓词。 如果将相对路径用于 lpDirectory 参数,请不要对 lpFile 使用相对路径。 + /// 如果 lpFile 指定可执行文件,则此参数是指向以 null 结尾的字符串的指针,该字符串指定要传递给应用程序的参数。 此字符串的格式由要调用的谓词决定。 如果 lpFile 指定文档文件, 则 lpParameters 应为 NULL。 + /// 指向 以 null 结尾的字符串的指针,该字符串指定操作) 目录的默认 (。 如果此值为 NULL,则使用当前工作目录。 如果在 lpFile 中提供了相对路径,请不要对 lpDirectory 使用相对路径。 + /// 指定应用程序在打开时如何显示应用程序的标志。 如果 lpFile 指定文档文件,则标志将直接传递给关联的应用程序。 由应用程序决定如何处理它。 它可以是在 ShowWindow 函数的 nCmdShow 参数中指定的任何值。 + /// + [LibraryImport(Shell32, EntryPoint = "ShellExecuteW", SetLastError = false, StringMarshalling = StringMarshalling.Utf16), PreserveSig] + public static partial int ShellExecute(IntPtr hwnd, [MarshalAs(UnmanagedType.LPWStr)] string lpOperation, [MarshalAs(UnmanagedType.LPWStr)] string lpFile, string lpParameters, [MarshalAs(UnmanagedType.LPWStr)] string lpDirectory, WindowShowStyle nShowCmd); } } diff --git a/GetStoreAppPackage/Package.appxmanifest b/GetStoreAppPackage/Package.appxmanifest index 3222b5566..9e966c716 100644 --- a/GetStoreAppPackage/Package.appxmanifest +++ b/GetStoreAppPackage/Package.appxmanifest @@ -11,7 +11,7 @@ + Version="4.6.904.0" /> ms-resource:PackageDisplayName diff --git a/GetStoreAppWebView/GetStoreAppWebView.res b/GetStoreAppWebView/GetStoreAppWebView.res index e4c414457385c01cd15325c24e150dc0a19bbd91..71dfc9246163bfc278cab9bfa395769b58061d8c 100644 GIT binary patch delta 59 zcmX?ePwLD)sfHHD7N!>F7M2#)Eo@4&I6Iix7+4q>7&@kF&tmIkG?~707TaY;lkL5; O+2%6>Y2CSO@F7M2#)Eo@4&INO-n7+4q>7}}<5&tmIkG@8D17TaY;qwT%3 O+2%6>Y2CSO@(thisPtr).GetEffectId(out Guid v); if (hr >= 0) { - if (value != null) + if (value is not null) { *value = v; } @@ -120,12 +120,12 @@ private static int GetNamedPropertyMappingFromAbi(IntPtr thisPtr, IntPtr name, u { try { - if (index != null) + if (index is not null) { *index = 0; } - if (mapping != null) + if (mapping is not null) { *mapping = 0; } @@ -133,12 +133,12 @@ private static int GetNamedPropertyMappingFromAbi(IntPtr thisPtr, IntPtr name, u int hr = ComWrappersSupport.FindObject(thisPtr).GetNamedPropertyMapping(name, out uint i, out GRAPHICS_EFFECT_PROPERTY_MAPPING m); if (hr >= 0) { - if (index != null) + if (index is not null) { *index = i; } - if (mapping != null) + if (mapping is not null) { *mapping = m; } @@ -157,7 +157,7 @@ private static int GetPropertyCountFromAbi(IntPtr thisPtr, uint* value) { try { - if (value != null) + if (value is not null) { *value = 0; } @@ -181,7 +181,7 @@ private static int GetPropertyFromAbi(IntPtr thisPtr, uint index, IntPtr* value) { try { - if (value != null) + if (value is not null) { *value = 0; } @@ -205,7 +205,7 @@ private static int GetSourceFromAbi(IntPtr thisPtr, uint index, IntPtr* value) { try { - if (value != null) + if (value is not null) { *value = 0; } @@ -230,7 +230,7 @@ private static int GetSourceCountFromAbi(IntPtr thisPtr, uint* value) { try { - if (value != null) + if (value is not null) { *value = 0; } diff --git a/Microsoft.Management.Deployment.Projection/Properties/AssemblyInfo.cs b/Microsoft.Management.Deployment.Projection/Properties/AssemblyInfo.cs index be8ec76ef..32afe6b64 100644 --- a/Microsoft.Management.Deployment.Projection/Properties/AssemblyInfo.cs +++ b/Microsoft.Management.Deployment.Projection/Properties/AssemblyInfo.cs @@ -7,11 +7,11 @@ [assembly: AssemblyCompany("高怡飞")] [assembly: AssemblyCopyright("©Copyright ©2022-2024 高怡飞, All Rights Reserved.")] [assembly: AssemblyDescription("获取商店应用 WinGet WinRT 扩展")] -[assembly: AssemblyFileVersion("4.6.902.0")] -[assembly: AssemblyInformationalVersion("4.6.902.0")] +[assembly: AssemblyFileVersion("4.6.904.0")] +[assembly: AssemblyInformationalVersion("4.6.904.0")] [assembly: AssemblyProduct("获取商店应用 WinGet WinRT 扩展")] [assembly: AssemblyTitle("获取商店应用 WinGet WinRT 扩展")] -[assembly: AssemblyVersion("4.6.902.0")] +[assembly: AssemblyVersion("4.6.904.0")] // 应用程序默认区域性的资源控制器设置 [assembly: NeutralResourcesLanguage("en-us")] diff --git a/Microsoft.Web.WebView2.Core.Projection/Properties/AssemblyInfo.cs b/Microsoft.Web.WebView2.Core.Projection/Properties/AssemblyInfo.cs index 70f0fca20..66b3dc19e 100644 --- a/Microsoft.Web.WebView2.Core.Projection/Properties/AssemblyInfo.cs +++ b/Microsoft.Web.WebView2.Core.Projection/Properties/AssemblyInfo.cs @@ -7,11 +7,11 @@ [assembly: AssemblyCompany("高怡飞")] [assembly: AssemblyCopyright("©Copyright ©2022-2024 高怡飞, All Rights Reserved.")] [assembly: AssemblyDescription("获取商店应用 WebView2 WinRT 扩展")] -[assembly: AssemblyFileVersion("4.6.902.0")] -[assembly: AssemblyInformationalVersion("4.6.902.0")] +[assembly: AssemblyFileVersion("4.6.904.0")] +[assembly: AssemblyInformationalVersion("4.6.904.0")] [assembly: AssemblyProduct("获取商店应用 WebView2 WinRT 扩展")] [assembly: AssemblyTitle("获取商店应用 WebView2 WinRT 扩展")] -[assembly: AssemblyVersion("4.6.902.0")] +[assembly: AssemblyVersion("4.6.904.0")] // 应用程序默认区域性的资源控制器设置 [assembly: NeutralResourcesLanguage("en-us")]