如何绑定 Windows 组合键

如何绑定 Windows 组合键

我不知道这是否可行,但是当使用 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 文档:

相关内容