Что нового

[Файловая система] Получить список выделенных файлов из контекстного меню

vcomp71

Осваивающий
Сообщения
431
Репутация
25
Начало обсуждения данной теме тут
http://autoit-script.ru/index.php/topic,11023.msg72683.html#msg72683
Теперь вопрос. Мы поместили команду в меню, а как получить список выделенных файло (директорий) для того, чтобы программа выполнила над ними действия?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Vlasssov
На основе http://autoit-script.ru/index.php?topic=3060.msg22328#msg22328
+ функция с оф форума:

Код:
#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

Нужно скомпилировать файл в Copy_path.exe, при первом запуске поместит пункт "Действия с файлами" в контекстное меню.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Через меню "Отправить" сделай.
 
Автор
vcomp71

vcomp71

Осваивающий
Сообщения
431
Репутация
25
WSWR [?]
Нужно скомпилировать файл в Copy_path.exe, при первом запуске поместит пункт "Действия с файлами" в контекстное меню.
Я так понял, там при запуске программы, указанной в реестре, туда все выделенные файлы (директории) как аргументы передаются? Или я что-то не так понял?
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Чтобы не мучился зря, скажу что gora делал "Кнопку" и не получилось через реестр передать выделенные файлы, а только один на котором якорь, даже "/1 /2 /3" не помогло. А через меню "Отправить" передаются все выделенные файлы ярлыку. Ярлык должен находится в папке "C:\Documents and Settings\имя\SendTo".
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Vlasssov
Передается один выделенный файл, и это просто служит условием запуска .
После запуска все выделенные файлы программа получает сама из объекта Shell.Application.
У меня так работает по горячей клавише, а не через меню.
 
Верх