gpt4 book ai didi

c# - 从 Windows 10 1709 开始优雅地重新启动 explorer.exe,Fall Creators Update aka Redstone 3

转载 作者:行者123 更新时间:2023-11-30 21:38:01 26 4
gpt4 key购买 nike

对于当前版本的 Windows 10、1703、Creators Update,我有这个小 C# 应用程序被调用以在安装序列期间重新启动 explorer.exe。这是为了帮助刷新任务栏/注册表项,以便安装后虚拟外围设备之一将出现在任务栏上而无需重新启动。

using System;
using System.Diagnostics;

namespace RestartExplorer
{
class Program
{
static int Main(string[] args)
{
var process = Process.GetProcessesByName("explorer")[0];
process.Kill();
Process.Start("explorer");
return 0;
}
}
}

这在 Redstone 2 中运行良好,但在 16294.1.170916-2023 的当前 Insiders Preview Windows 10 1709 Redstone 3 版本中,它不仅会杀死资源管理器外壳,还会杀死 < em>所有 打开的文件资源管理器窗口。这是 super 侵入性的,如果发生这种情况时我在工作时打开了几十个窗口,我认为我不会对用户体验感到非常满意。

我确认CTRL+SHIFT右键单击退出资源管理器/strong> 也显示出相同的发散行为,而不仅仅是我的小应用。

所以,如果我想确保我的用户的窗口不会全部丢失,我现在应该如何重新启动资源管理器,或者更好的是,是否有更好的方法来获得我现在的最终结果想做什么?

最佳答案

使用重启管理器 API 关闭所有打开的浏览器。它将重新启动任何已关闭的。唯一的缺点是重新启动的应用程序将被激活,因此您必须围绕您的应用程序失去焦点进行编码。

参见 https://msdn.microsoft.com/en-us/library/windows/desktop/aa373649(v=vs.85).aspx

var sessionKey = Guid.NewGuid().ToString();
NativeMethods.RmStartSession(out IntPtr session, 0, sessionKey).CheckError();
try
{
NativeMethods.RmRegisterResources(session, 1, new[] { Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "explorer.exe") }, 0, null, 0, null).CheckError();
NativeMethods.RmShutdown(session, 0, null).CheckError();
NativeMethods.RmRestart(session, 0, null).CheckError();
}
finally
{
NativeMethods.RmEndSession(session);
}

您还需要以下 NativeMethods

public static class NativeMethods
{
[StructLayout(LayoutKind.Sequential)]
internal struct RM_UNIQUE_PROCESS
{
public int dwProcessId;
public com.FILETIME ProcessStartTime;
}

[Flags]
internal enum RM_SHUTDOWN_TYPE : uint
{
RmForceShutdown = 0x1,
RmShutdownOnlyRegistered = 0x10
}

internal delegate void RM_WRITE_STATUS_CALLBACK(UInt32 nPercentComplete);

[DllImport("rstrtmgr.dll", CharSet = CharSet.Auto)]
internal static extern int RmStartSession(out IntPtr pSessionHandle, int dwSessionFlags, string strSessionKey);

[DllImport("rstrtmgr.dll")]
internal static extern int RmEndSession(IntPtr pSessionHandle);

[DllImport("rstrtmgr.dll", CharSet = CharSet.Auto)]
internal static extern int RmRegisterResources(IntPtr pSessionHandle, UInt32 nFiles, string[] rgsFilenames, UInt32 nApplications, RM_UNIQUE_PROCESS[] rgApplications, UInt32 nServices, string[] rgsServiceNames);

[DllImport("rstrtmgr.dll")]
internal static extern int RmShutdown(IntPtr pSessionHandle, RM_SHUTDOWN_TYPE lActionFlags, RM_WRITE_STATUS_CALLBACK fnStatus);

[DllImport("rstrtmgr.dll")]
internal static extern int RmRestart(IntPtr pSessionHandle, int dwRestartFlags, RM_WRITE_STATUS_CALLBACK fnStatus);

[DllImport("kernel32.dll")]
internal static extern bool GetProcessTimes(IntPtr hProcess, out com.FILETIME lpCreationTime, out com.FILETIME lpExitTime, out com.FILETIME lpKernelTime, out com.FILETIME lpUserTime);
}

关于c# - 从 Windows 10 1709 开始优雅地重新启动 explorer.exe,Fall Creators Update aka Redstone 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46436549/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com