Что нового

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

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Можно ли средствами AutoIt написать скрипт, который по нажатию горячей клавиши будет копировать в буфер путь до выделенного мышью объекта - папки, файла?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
WSWR
Попробуйте так:
Код:
#include <GuiListView.au3>

HotKeySet("+{1}", "_MyFunc");Shift+1 проверить
HotKeySet("+{ESC}", "_Exit");Shift+Esc - выход

$iCheck = 1

While 1
	While $iCheck
		Sleep(10)
	WEnd
	Dim $aResult[1][2]
	$j = 0
	$sMessage = ''
	;Рабочий стол
	$hListView = ControlGetHandle('Program Manager', '', '[CLASS:SysListView32; INSTANCE:1]')
	$iNumber = _GUICtrlListView_GetItemCount($hListView)
	For $i = 0 To $iNumber - 1
		If _GUICtrlListView_GetItemSelected($hListView, $i) Then
			$sPath = _GUICtrlListView_GetItemText($hListView, $i)

			If StringInStr(FileGetAttrib(@DesktopDir & '\' & $sPath), 'D') Then
				ReDim $aResult[UBound($aResult) + 1][2]
				$j += 1
				$aResult[$j][0] = @DesktopDir & '\' & $sPath
			ElseIf FileGetAttrib(@DesktopDir & '\' & $sPath) Then
				ReDim $aResult[UBound($aResult) + 1][2]
				$j += 1
				$aResult[$j][1] = @DesktopDir & '\' & $sPath
			ElseIf FileGetAttrib(@DesktopDir & '\' & $sPath & '.lnk') Then
				ReDim $aResult[UBound($aResult) + 1][2]
				$j += 1
				$aResult[$j][1] = @DesktopDir & '\' & $sPath
				$aResult[$j][1] = @DesktopDir & '\' & $sPath & '(ярлык)'
			EndIf
		EndIf
	Next
	;Открытые папки
	$aList = WinList('[Class:CabinetWClass]')
	If $aList[0][0] Then
		For $i = 1 To UBound($aList) - 1
			$hListView = ControlGetHandle($aList[$i][1], '', '[CLASS:SysListView32; INSTANCE:1]')
			$iNumber = _GUICtrlListView_GetItemCount($hListView)
			For $w = 0 To $iNumber - 1
				If _GUICtrlListView_GetItemSelected($hListView, $w) Then
					$sPath = _GUICtrlListView_GetItemText($hListView, $w)
					$aTemp = StringSplit(WinGetText($aList[$i][1]), @LF)
					For $x = 1 To UBound($aTemp)
						If StringInStr($aTemp[$x], ':\') Then
							$sPath = $aTemp[$x] & '\' & $sPath
							ExitLoop
						EndIf
					Next

					If StringInStr(FileGetAttrib($sPath), 'D') Then
						ReDim $aResult[UBound($aResult) + 1][2]
						$j += 1
						$aResult[$j][0] = $sPath
					ElseIf FileGetAttrib($sPath) Then
						ReDim $aResult[UBound($aResult) + 1][2]
						$j += 1
						$aResult[$j][1] = $sPath
					ElseIf FileGetAttrib($sPath & '.lnk') Then
						ReDim $aResult[UBound($aResult) + 1][2]
						$j += 1
						$aResult[$j][1] = $sPath & '(ярлык)'
					EndIf
				EndIf
			Next
		Next
	EndIf
	If UBound($aResult) > 1 Then
		$sMessage &= 'Выделенные папки:' & @LF & @LF
		For $i = 1 To UBound($aResult) - 1
			If $aResult[$i][0] Then
				$sMessage &= $aResult[$i][0] & @LF
			EndIf
		Next
		$sMessage &= @LF & @LF & 'Выделенные файлы:' & @LF & @LF
		For $i = 1 To UBound($aResult) - 1
			If $aResult[$i][1] Then
				$sMessage &= $aResult[$i][1] & @LF
			EndIf
		Next
		MsgBox(0, 'Результат', $sMessage)
		;ClipPut($sMessage)
	Else
		MsgBox(0, 'Результат', 'Нет выделенных папок и файлов.')
	EndIf
	$iCheck = 1
	Sleep(10)
WEnd

Func _MyFunc()
	$iCheck = 0
EndFunc   ;==>_MyFunc

Func _Exit()
	Exit
EndFunc   ;==>_Exit
 
Автор
W

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
madmasles
Спасибо за пример.

Написал и свой, более простой:

Код:
$var = ControlGetText("", "","[CLASS:Edit; INSTANCE:1]")
If $var = "" Then
  $r=ControlListView($var, "", "SysListView321", "GetSelected", 1)
$r1=ControlListView($var, "", "SysListView321", "GetText", $r, 0)
$r2="D:\Desktop" & "\" & $r1; для рабочего стола - замена пустой строки на адрес стола
MsgBox(0, "", $r2)
ClipPut($r2)
Else
  $r=ControlListView($var, "", "SysListView321", "GetSelected", 1)
$r1=ControlListView($var, "", "SysListView321", "GetText", $r, 0)
$r2=$var & "\" & $r1
MsgBox(0, "", $r2)
ClipPut($r2)
EndIf


Однако возникли проблемы - в ХР оба скрипта работают, а в семерке отказываются, видимо, там другие классы окон, контролы не читаются как в ХР.
Менял эти параметры, но ничего не получается. Путь до папки - пожалуйста, а вот имя выделенного объекта - нет.
И, к сожалению, скрипт нужен именно для семерки.
 
Автор
W

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Переделал скрипт по другому принципу, в семерке работает удовлетворительно.
При выделенном объекте - получает путь к этому объекту, если ничего не выделено - отображается путь к папке:

Код:
$var1 = ControlGetText("", "","[CLASS:ToolbarWindow32; INSTANCE:2]")
If $var1 = "" Then
Send("{F2}")
$r1 = ControlGetText("", "","[CLASS:Edit; INSTANCE:1]")
$r2="D:\Desktop" & "\" & $r1; для рабочего стола - замена пустой строки на адрес стола
MsgBox(0, "", $r2)
ClipPut($r2)
Else
Send("{F2}")
$r0 = StringTrimLeft($var1, 7)
$r1 = ControlGetText("", "","[CLASS:Edit; INSTANCE:1]")
$r2 = $r0 & "\" & $r1
MsgBox(0, "", $r2)
ClipPut($r2)
EndIf


Теперь хотя бы с путями к файлам станет легче работать :IL_AutoIt_1:
 
Верх