如何让 Windows 10 的资源管理器在打开同一文件夹时聚焦现有窗口

如何让 Windows 10 的资源管理器在打开同一文件夹时聚焦现有窗口

有一种场景:假设我打开了两个资源管理器窗口,窗口 1 显示文件夹C:/data,窗口 2 显示文件夹C:/

我想要的是,当我双击(打开)data窗口 1 ( C:/) 中的文件夹时,窗口 2 ( C:/data) 获得焦点,而不是打开data窗口 1 中的文件夹。

我在这里发现了类似的问题:所以线程但它是 2018 年的,并且不针对 Windows 10。我想知道我的情况是否有所不同。

提前致谢,

答案1

我已经编写了一个 powershell 脚本SwitchOrOpenFolder.ps1,它可以与简单的注册表黑客结合完成这项工作HKEY_CLASSES_ROOT\Folder

笔记:在创建、编辑或修改任何键或值之前,请务必备份 Windows 注册表。

  1. SwitchOrOpen选项添加到驱动器和文件夹的上下文菜单并将其与D:\PShell\tests\SwitchOrOpenFolder.ps1脚本的静默运行相关联(改变路径以适应你的情况)。此步骤应产生以下结果:
reg query "HKEY_CLASSES_ROOT\Folder\shell\SwitchOrOpen\command"
HKEY_CLASSES_ROOT\文件夹\shell\SwitchOrOpen\命令
    (默认)REG_SZ mshta.exe vbscript:Execute("CreateObject(""WScript.Shell"").Run ""powershell -NoProfile -ExecutionPolicy Bypass -File """"D:\PShell\tests\SwitchOrOpenFolder.ps1"""" -Path """"%V"""""",0:close")
  1. SwitchOrOpen动词设为驱动器和文件夹上下文菜单中的默认选项(选修的:将此选项映射到鼠标双击或键盘Enter);结果应如下所示:
reg query "HKEY_CLASSES_ROOT\Folder\shell" -ve
HKEY_CLASSES_ROOT\Folder\shell
    (Default)    REG_SZ    SwitchOrOpen
  1. 使用以下SwitchOrOpenFolder.ps1脚本:
param ( [Parameter(Mandatory)] [string]$Path )
if ( '"' -eq $Path.Substring($Path.Length-1) ) {
    $Path = $Path.Substring(0, $Path.Length-1) + '\'
}
$type = 'Microsoft.PowerShell.Commands.AddType.AutoGeneratedTypes.WindowAPI' -as [type]
if ( $null -eq  $type ) {
    $sig = @'
    [DllImport("user32.dll")] public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);
    [DllImport("user32.dll")] public static extern int SetForegroundWindow(IntPtr hwnd);
    [DllImport("user32.dll")] public static extern IntPtr GetForegroundWindow();
'@
    $type = Add-Type -MemberDefinition $sig -Name WindowAPI -PassThru
}
$FileExplorer = (New-Object -ComObject 'Shell.Application').Windows() |
    Where-Object Name -EQ 'File Explorer'
$windows = $FileExplorer |
    Where-Object { ( $Path -eq $_.Document.Folder.Self.Path ) } |
        Select-Object -First 1
if ( $null -eq $windows ) {
    $windows = $FileExplorer |
        Where-Object { ( $type::GetForegroundWindow() -eq $_.HWND ) }
    if ( $null -eq $windows ) {
        C:\WINDOWS\explorer.exe /e,$Path
    } else {
        $windows.Navigate($Path)
    }
    return
}
$hwnd = $windows.HWND
if ( -32000 -in $windows.Left, $windows.Top ) {
    $null = $type::ShowWindowAsync($hwnd, 4) # ShowNoActivate
}
$null = $type::SetForegroundWindow($hwnd) 

附录。以下 Windows 10 注册表文件SwitchOrOpen.reg代表上述步骤 1 和 2:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Folder\shell]
@="SwitchOrOpen"

[HKEY_CLASSES_ROOT\Folder\shell\SwitchOrOpen]

[HKEY_CLASSES_ROOT\Folder\shell\SwitchOrOpen\command]
@="mshta.exe vbscript:Execute(\"CreateObject(\"\"WScript.Shell\"\").Run \"\"powershell -NoProfile -ExecutionPolicy Bypass -File \"\"\"\"D:\\PShell\\tests\\SwitchOrOpenFolder.ps1\"\"\"\" -Path \"\"\"\"%V\"\"\"\"\"\",0:close\")"

相关内容