1

Тема: AutoHotkey: определение текущего пути в окне Проводника

Скрипт демонстрирует возможность определения текущего пути в окне Проводника. По нажатию F11 скрипт выводит окно сообщения, в котором указан путь к папке, откытой в текущем окне Проводника. Работает в WinХР, но не работает в Win2000.

F11::
  hWnd := WinExist("A") 
  WinGetClass wClass, ahk_id %hWnd% 
  If (wClass != "ExploreWClass" and wClass != "CabinetWClass") 
     MsgBox Используйте только в окне Проводника! 
  Else 
     MsgBox % GetWindowsExplorerPath(hWnd) 
Return

;=================================================

GetWindowsExplorerPath(_hWnd) 
{ 
   local pid, hMem, pv, pidl, pidl?, explorerPath 

   If (A_OSType = "WIN32_NT") 
   { 
      pid := DllCall("GetCurrentProcessId") 
      SendMessage 0x400 + 12   ; CWM_GETPATH = WM_USER + 12 
            , pid, 0, , ahk_id %_hWnd% 
      hMem := ErrorLevel 
      if (hMem != 0) 
      { 
         pv := DllCall("Shell32\SHLockShared" 
            , "UInt", hMem, "UInt", pid) 
         if (pv != 0) 
         { 
            pidl := DllCall("Shell32\ILClone", "UInt", pv) 
            DllCall("Shell32\SHUnlockShared", "UInt", pv) 
         } 
         DllCall("Shell32\SHFreeShared" 
            , "UInt", hMem, "UInt", pid) 
      } 
   } 
   VarSetCapacity(explorerPath, 512, 0) 
   DllCall("Shell32\SHGetPathFromIDList" 
      , "UInt", pidl, "Str", explorerPath) 
   Return explorerPath 
}

Скрипт опубликовал YMP.

Предложения в русском языке начинаются с большой буквы и заканчиваются точкой.
В названии ветки всегда должен быть указан язык программирования или среда исполнения скрипта, если это возможно.

2

Re: AutoHotkey: определение текущего пути в окне Проводника

Для большего удобства копирования пути в буфер вместо MsgBox можно вызвать специальное окно GUI:

F11::
  hWnd := WinExist("A") 
  WinGetClass wClass, ahk_id %hWnd% 
  If (wClass != "ExploreWClass" and wClass != "CabinetWClass") 
     MsgBox Используйте только в окне Проводника! 
  Else
  {  
    ;MsgBox % GetWindowsExplorerPath(hWnd) 
    Res := GetWindowsExplorerPath(hWnd)
    Gui, +AlwaysOnTop
    Gui, Add, Edit, vMainEdit W600
    GuiControl,, MainEdit, %Res%
    Gui, Show, AutoSize Center, Текущий путь
   }
Return

GuiClose:
Gui, Destroy
Return

;=================================================

GetWindowsExplorerPath(_hWnd) 
{ 
   local pid, hMem, pv, pidl, pidl?, explorerPath 

   If (A_OSType = "WIN32_NT") 
   { 
      pid := DllCall("GetCurrentProcessId") 
      SendMessage 0x400 + 12   ; CWM_GETPATH = WM_USER + 12 
            , pid, 0, , ahk_id %_hWnd% 
      hMem := ErrorLevel 
      if (hMem != 0) 
      { 
         pv := DllCall("Shell32\SHLockShared" 
            , "UInt", hMem, "UInt", pid) 
         if (pv != 0) 
         { 
            pidl := DllCall("Shell32\ILClone", "UInt", pv) 
            DllCall("Shell32\SHUnlockShared", "UInt", pv) 
         } 
         DllCall("Shell32\SHFreeShared" 
            , "UInt", hMem, "UInt", pid) 
      } 
   } 
   VarSetCapacity(explorerPath, 512, 0) 
   DllCall("Shell32\SHGetPathFromIDList" 
      , "UInt", pidl, "Str", explorerPath) 
   Return explorerPath 
}