Что нового

вставить в контекстное меню для .lnk (ярлыков) функцию найти объект

ziggy17

Новичок
Сообщения
8
Репутация
0
вместо или кроме кнопки «Найти объект...» в окне свойств ярлыков (файлов .lnk) был бы такой же пункт в их контекстном меню

есть решение на Java хотелось бы на AutoIt

для конкретного ярлыка я нашёл это:

$details = FileGetShortcut(@DesktopDir & "\Shortcut.lnk")
MsgBox(0, "Path:", $details[1])
run ("explorer "& $details[1])

реестровский файл для добавления в контекстное меню ярлыков берём из примера ниже. а в последнюю строку надо подставить команду которая передаёт скрипту полный путь до ярлыка

на Java:
*************************************
пишем скрипт
---------------------
Код:
// FindTarget.js
// аргумент - путь к lnk-ярлыку
try {
var
Item=GetItemByPath(WScript.Arguments.Item(0)).GetLink.Target,
ShellWindows=Item.Application.Windows(),
ParentItem=Item.Parent.Self,
ParentFolderPath=ParentItem.Path,
GrandParentFolderPath=ParentItem.Parent.Self.Path;
ParentItem.InvokeVerb("Open");
for (var t=50; --t>=0; WScript.Sleep(50))
try {
var
FolderView=ShellWindows.Item().Document,
FolderViewItem=FolderView.Folder.Self;
if (
FolderViewItem.Path==ParentFolderPath &&
FolderViewItem.Parent.Self.Path==GrandParentFolderPath
) {
FolderView.SelectItem(Item, 1|4|8|16);
break;
}
} catch (Err) {}
} catch (Err) {}

function GetItemByPath (Path) {
var
Shell=new ActiveXObject("Shell.Application"),
FSO=new ActiveXObject("Scripting.FileSystemObject");
return Shell.
NameSpace(FSO.GetParentFolderName(Path)).ParseName(FSO.GetFileName(Path));
}
-----------------
сохраняем с расширением .js кладем например в G:\findobject\findobject.js

делаем там же рег файл
Код:
REGEDIT4

[HKEY_CLASSES_ROOT\lnkfile\shell\FindTarget]
@="&Найти объект"
[HKEY_CLASSES_ROOT\lnkfile\shell\FindTarget\command]
@="C:\\WINDOWS\\System32\\WScript.exe \"G:\\findobject\\findobject.js\" \"%1\""

выполняем и наслаждаемся функционалом
отдельное спасибо ребятам с http://forum.script-coding.info
*************************************

в этой же теме - как создать пункт в контекстном меню для всех файлов - "скопировать путь до файла в буфер обмена" (в реестре знаю как добавить пункт)

***********************
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\*\shell\222]
@="Копировать путь в буфер"

[HKEY_CLASSES_ROOT\*\shell\222\command]
@=" "
***********************
 

madmasles

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

Opt('WinTitleMatchMode', 2)

$sLnk = 'Полный путь к ярлыку с расширением .lnk'

For $i = 1 To 5
	$iCheck = _SelectedFile_Lnk($sLnk)
	If $iCheck Then ExitLoop
Next
If Not $iCheck Then
	MsgBox(0, 'Error', 'Произошла какая-то ошибка.')
EndIf

Func _SelectedFile_Lnk($sPathLnk)
	Local $aDetails, $aPath, $hFolder, $hListView, $iIndex

	$aDetails = FileGetShortcut($sPathLnk)
	If Not IsArray($aDetails) Then Return 0
	$aPath = StringSplit($aDetails[0], '\')
	ShellExecute($aDetails[1])
	$hFolder = WinWait($aPath[$aPath[0] - 1], '', 5)
	If Not IsHWnd($hFolder) Then Return 0
	$hListView = ControlGetHandle($hFolder, '', '[CLASS:SysListView32; INSTANCE:1]')
	$iIndex = _GUICtrlListView_FindText($hListView, $aPath[$aPath[0]])
	If $iIndex = -1 Then Return 0
	If _GUICtrlListView_SetItemSelected($hListView, $iIndex) Then
		Return 1
	Else
		Return 0
	EndIf
EndFunc   ;==>_SelectedFile_Lnk
 

aleratorio

Осваивающий
Сообщения
85
Репутация
43
Код:
;Проверяем есть ли параметры командной строки (передаются системой при выборе пункта)
If $CmdLine[0] <> 0 Then
	$Lnk = FileGetShortcut($CmdLine[1])
	$TargetFile = $Lnk[0]
	$TargetFolder = StringLeft($TargetFile, StringInStr($TargetFile, "\", 0, -1))
	ShellExecute("explorer.exe", $TargetFolder)
Else
	;Проверяем интеграцию в меню
	If RegRead("HKCR\lnkfile\shell\Найти объект\command", "") = "" Then
		If MsgBox(32 + 1, "", "Добавить пункт в контекстное меню?") = 2 Then Exit
		RegWrite("HKCR\lnkfile\shell\Найти объект\command", "", "REG_SZ", @ScriptDir & '\ShortcutGetTarget.exe "%1"')
	Else
		If MsgBox(32 + 1, "", "Удалить пункт из контекстного меню?") = 2 Then Exit
		RegDelete("HKCR\lnkfile\shell\Найти объект")
	EndIf
EndIf




При запуске предлагает добавить команду в контекстное меню, либо если команда добавлена - удалить ее
Только надо скомпилировать скрипт под именем ShortcutGetTarget.exe, т.к. ссылка в реестре делается на него, либо изменить имя в скрипте

P.S. Когда делал скриншот - заметил что во всяком случае в Windows 7 есть пункт "Расположение файла", который делает тоже самое...
 

Arei

Скриптер
Сообщения
938
Репутация
115
а можешь подсказать что нужно изменить что бы выполнялись другие функции.Извините за глупый вопрос.А то пытаюсь изменить а не получается.
 

aleratorio

Осваивающий
Сообщения
85
Репутация
43
Arei сказал(а):
а можешь подсказать что нужно изменить что бы выполнялись другие функции.Извините за глупый вопрос.А то пытаюсь изменить а не получается.

не понял - какие другие функции? если ты это конечно мне...
 

Arei

Скриптер
Сообщения
938
Репутация
115
да тебе.Просто например не поиск где расположен файл а запуск какой либо программы.
 

aleratorio

Осваивающий
Сообщения
85
Репутация
43
Добавляет в меню для текстовых файлов (*.txt) пункт "Просмотр текстового файла в wordpade":
Код:
RegWrite("HKCR\txtfile\shell\Просмотр текстового файла в wordpade\command", "", "REG_SZ", @ProgramFilesDir & '\Windows NT\Accessories\wordpad.exe "%1"')


Вот посмотри еще - только вчера писал: http://autoit-script.ru/index.php/topic,1508.15.html
 

Arei

Скриптер
Сообщения
938
Репутация
115
Спасибо разобрался спасибо


Добавлено:
Сообщение автоматически объединено:

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

aleratorio

Осваивающий
Сообщения
85
Репутация
43
Arei сказал(а):
а так же можно сделать для клика мыши по пустой части экрана, в контекстном меню то же появились записи определенные

Код:
RegWrite("HKEY_CLASSES_ROOT\Directory\Background\shell\открыть блокнот\command", "", "REG_SZ", "notepad.exe")


Если это был вопрос...

А так же HKEY_CLASSES_ROOT\*\shell... - все фалы
HKEY_CLASSES_ROOT\Unknown\shell... - неизвестные типы файлов
HKEY_CLASSES_ROOT\jpegfile\shell... - jpeg файлы
HKEY_CLASSES_ROOT\Drive\shell... - диски
и т.п.
 

Arei

Скриптер
Сообщения
938
Репутация
115
у меня что то не работает или оно после перезагрузки компа?
 

aleratorio

Осваивающий
Сообщения
85
Репутация
43
да, в XP почему то не работает... хотя все остальные примеры работают
 

Arei

Скриптер
Сообщения
938
Репутация
115
согласен интересно почему так?
 

aleratorio

Осваивающий
Сообщения
85
Репутация
43
Не знаю. Но например в xp так же нельзя с помощью реестра создать вложенные меню и добавить иконки к меню, а в семерке можно.

При поиске в инете натыкаюсь везде как это сделать в семерке. про xp ни слова...

P.S. Все, я спать, с ночной приехал. Сегодня снова в ночь, так что может потом чего нарою на эту тему
 
Автор
Z

ziggy17

Новичок
Сообщения
8
Репутация
0
for aleratorio

большое спасибище!!!

на основе Вашего примера разобрался как создать пункт в контекстном меню для всех файлов - "скопировать путь до файла в буфер обмена"

Код:
#include <File.au3>

If $CmdLine[0] <> 0 Then
	
	$Apath = _PathFull($CmdLine[1])
	ClipPut($Apath)

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"')
    Else
        If MsgBox(32 + 1, "", "Удалить пункт из контекстного меню?") = 2 Then Exit
        RegDelete("HKCR\*\shell\Копировать путь в буфер")
    EndIf
EndIf


скрипт должен быть под именем под именем Copy_path.exe или с вашим названием
 
Верх