有一种场景:假设我打开了两个资源管理器窗口,窗口 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 注册表。
- 将
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")
- 将
SwitchOrOpen
动词设为驱动器和文件夹上下文菜单中的默认选项(选修的:将此选项映射到鼠标双击或键盘Enter);结果应如下所示:
reg query "HKEY_CLASSES_ROOT\Folder\shell" -ve
HKEY_CLASSES_ROOT\Folder\shell (Default) REG_SZ SwitchOrOpen
- 使用以下
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\")"