我不知道这是否可行,但是当使用 powershell/windows 终端实例时,我想绑定组合键 Win+E 以在终端中打开的当前路径上打开文件资源管理器。
我发现该explorer
命令可以执行此操作,但我不知道是否可以绑定系统范围的组合键(如 Win+E)来执行从正在运行的程序中获取数据(当前路径)的操作。任何见解都值得赞赏。
答案1
WinWindows 已经使用了+组合键E,因此不是最佳选择。此答案改用 Ctrl+ E。以下代码将使您能够在 PowerShell 提示符下按下组合键并在当前路径打开 Explorer。它需要 PSReadLine 模块。
Set-PSReadLineKeyHandler -Key ctrl+e `
-BriefDescription ExplorerAtCurrentPath `
-LongDescription "Open Explorer at Current Path" `
-ScriptBlock {
Start-Process -FilePath 'explorer.exe' -ArgumentList "/separate , $($pwd.Path)" -Wait
}
答案2
Win+组合键E已被 Windows 使用,因此不是最佳选择。此答案改用 Alt+ E,使用免费的 自动热键。
它将适用于任何当前处于焦点状态的进程。
安装 AutoHotKey 后,将以下脚本放入文件中.ahk
并双击进行测试。您可以通过右键单击托盘栏中的绿色 H 图标并选择退出来停止脚本。要让它在登录时运行,请将其放在 的启动组中
C:\Users\USER-NAME\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
。
脚本如下:
!e::
WinGet, process, PID, A
MsgBox, %process%
curdir := GetProcessCurrentDirectory(process)
MsgBox, %curdir%
Run, explorer %curdir%
return
GetProcessCurrentDirectory(PID) {
static PROCESS_QUERY_INFORMATION := 0x400, PROCESS_VM_READ := 0x10, STATUS_SUCCESS := 0
hProc := DllCall("OpenProcess", UInt, PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, Int, 0, UInt, PID, Ptr)
(A_Is64bitOS && DllCall("IsWow64Process", Ptr, hProc, UIntP, IsWow64))
if (!A_Is64bitOS || IsWow64)
PtrSize := 4, PtrType := "UInt", pPtr := "UIntP"
else
PtrSize := 8, PtrType := "Int64", pPtr := "Int64P"
offsetCURDIR := 4*4 + PtrSize*5
hModule := DllCall("GetModuleHandle", "str", "Ntdll", Ptr)
if (A_PtrSize < PtrSize) { ; <<—— script 32, target process 64
if !QueryInformationProcess := DllCall("GetProcAddress", Ptr, hModule, AStr, "NtWow64QueryInformationProcess64", Ptr)
failed := "NtWow64QueryInformationProcess64"
if !ReadProcessMemory := DllCall("GetProcAddress", Ptr, hModule, AStr, "NtWow64ReadVirtualMemory64", Ptr)
failed := "NtWow64ReadVirtualMemory64"
info := 0, szPBI := 48, offsetPEB := 8
}
else {
if !QueryInformationProcess := DllCall("GetProcAddress", Ptr, hModule, AStr, "NtQueryInformationProcess", Ptr)
failed := "NtQueryInformationProcess"
ReadProcessMemory := "ReadProcessMemory"
if (A_PtrSize > PtrSize) ; <<—— script 64, target process 32
info := 26, szPBI := 8, offsetPEB := 0
else ; <<—— script and target process have the same bitness
info := 0, szPBI := PtrSize * 6, offsetPEB := PtrSize
}
if failed {
DllCall("CloseHandle", Ptr, hProc)
MsgBox, Failed to get pointer to %failed%
Return
}
VarSetCapacity(PBI, 48, 0)
if DllCall(QueryInformationProcess, Ptr, hProc, UInt, info, Ptr, &PBI, UInt, szPBI, UIntP, bytes) != STATUS_SUCCESS {
DllCall("CloseHandle", Ptr, hProc)
Return
}
pPEB := NumGet(&PBI + offsetPEB, PtrType)
DllCall(ReadProcessMemory, Ptr, hProc, PtrType, pPEB + PtrSize * 4, pPtr, pRUPP, PtrType, PtrSize, UIntP, bytes)
DllCall(ReadProcessMemory, Ptr, hProc, PtrType, pRUPP + offsetCURDIR, UShortP, szBuff, PtrType, 2, UIntP, bytes)
DllCall(ReadProcessMemory, Ptr, hProc, PtrType, pRUPP + offsetCURDIR + PtrSize, pPtr, pCURDIR, PtrType, PtrSize, UIntP, bytes)
VarSetCapacity(buff, szBuff, 0)
DllCall(ReadProcessMemory, Ptr, hProc, PtrType, pCURDIR, Ptr, &buff, PtrType, szBuff, UIntP, bytes)
DllCall("CloseHandle", Ptr, hProc)
Return currentDirPath := StrGet(&buff, "UTF-16")
}
有用的 AutoHotkey 文档: