#NoTrayIcon
#include <Array.au3>
#include <WinAPI.au3>
If $CmdLine[0] <> 0 Then
If UBound(ProcessList('Copy_path.exe')) > 2 Then Exit
_Selected()
Else
If RegRead('HKCR\*\shell\Действия с файлами\command', '') = '' Then
If MsgBox(32 + 1, '', 'Добавить пункт в контекстное меню?') = 2 Then Exit
RegWrite('HKCR\*\shell\Действия с файлами\command', '', 'REG_SZ', @ScriptDir & '\Copy_path.exe "%1"') ; скомпилировать в Copy_path.exe
Else
If MsgBox(32 + 1, '', 'Удалить пункт из контекстного меню?') = 2 Then Exit
RegDelete('HKCR\*\shell\Действия с файлами')
EndIf
EndIf
Func _Selected()
Local $hWnd = _WinAPI_GetForegroundWindow()
$class = _WinAPI_GetClassName($hWnd)
If $class = 'CabinetWClass' Then
$aSelection = _WindowsExplorer_ExtractSelectedDirAndFiles($hWnd)
_ArrayDisplay($aSelection)
EndIf
EndFunc ;==>_Selected
; ===================================================================================================================
; Name...........: _WindowsExplorer_ExtractSelectedDirAndFiles
; Description....: Function to extract LocationURL and selected files from a "Windows Explorer" Window
; Syntax.........: _WindowsExplorer_ExtractSelectedDirAndFiles($hWnd)
; Parameters.....: $hWnd - Windows handle of an "Windows Explorer" Window
; AutoIt Version.: 3.3.6.1
; Return values..: Success - Array
; Array[0] = Number of files selected in right-hand Listview
; Array[1] = LocationURL - selected in left-hand Treeview or Window Rebar
; Array[2] - Array[n] = URL of selected files in right-hand Listview
; Failure - Array
; Array[0] = 0
; Array[1] = ""
; Sets the @error flag to non-zero.
; @error = 1 - $hwnd is not a valid window handle
; @error = 2 - $hwnd is not a window handle for an "Windows Explorer" Window
; @error = 3 - "Shell.Application" object could not be created
; @error = 4 - "$oShellApp.Windows()" object could not be created
; Author.........: Ascend4nt, KaFu, klaus.s
; ===================================================================================================================
Func _WindowsExplorer_ExtractSelectedDirAndFiles($hWnd)
Local $aExplorerSelectedFiles[2] = [0, ""]
If Not IsHWnd($hWnd) Then Return SetError(1, 0, $aExplorerSelectedFiles)
Local $aWinList = WinList("[REGEXPCLASS:(Explore|Cabinet)WClass]")
While 1
For $i = 1 To UBound($aWinList) - 1
If $hWnd = $aWinList[$i][1] Then ExitLoop 2
Next
Return SetError(2, 0, $aExplorerSelectedFiles)
WEnd
Local $oShellApp = ObjCreate("Shell.Application")
If Not IsObj($oShellApp) Then Return SetError(3, 0, $aExplorerSelectedFiles)
Local $oShellApp_Windows = $oShellApp.Windows()
If Not IsObj($oShellApp_Windows) Then Return SetError(4, 0, $aExplorerSelectedFiles)
For $oShellApp_Inst In $oShellApp_Windows
If $oShellApp_Inst.hwnd = $hWnd Then ExitLoop
Next
Local $oShellApp_Inst_SelectedItems_Count = $oShellApp_Inst.document.SelectedItems.Count
Local $oShellApp_Inst_LocationURL = $oShellApp_Inst.LocationURL
Local $aHexCodes = StringRegExp($oShellApp_Inst_LocationURL, '%([[:xdigit:]]{2})', 3)
If Not @error Then
; Change all the '%xx' values into ';'s (invalid path character)
$oShellApp_Inst_LocationURL = StringRegExpReplace($oShellApp_Inst_LocationURL, '%([[:xdigit:]]{2})', ';')
; Then go through 1 by 1 and replace each ';' in left-to-right order (same as array order)
For $i = 0 To UBound($aHexCodes) - 1
$oShellApp_Inst_LocationURL = StringReplace($oShellApp_Inst_LocationURL, ';', ChrW('0x' & $aHexCodes[$i]), 1) ; only the 1st occurrence for each rep!
Next
EndIf
$oShellApp_Inst_LocationURL = StringReplace($oShellApp_Inst_LocationURL, 'file:///', '')
$aExplorerSelectedFiles[0] = $oShellApp_Inst_SelectedItems_Count
$aExplorerSelectedFiles[1] = StringReplace($oShellApp_Inst_LocationURL, '/', '\')
ReDim $aExplorerSelectedFiles[$aExplorerSelectedFiles[0] + 2]
$oShellApp_Inst_SelectedItems = $oShellApp_Inst.document.SelectedItems
Local $iCounter = 2
For $oShellApp_Inst_SelectedItem In $oShellApp_Inst_SelectedItems
$aExplorerSelectedFiles[$iCounter] = $oShellApp_Inst_SelectedItem.path
$iCounter += 1
Next
$oShellApp = 0
$oShellApp_Windows = 0
Return $aExplorerSelectedFiles
EndFunc ;==>_WindowsExplorer_ExtractSelectedDirAndFiles