MyTetra Share
Делитесь знаниями!
Средствами VBA пытаюсь удалить ярлык с панели быстрого запуска панели задач Windows 7
Время создания: 16.03.2019 23:43
Раздел: Разные закладки - VBA - Средства Windows
Запись: xintrea/mytetra_db_adgaver_new/master/base/1514580233w521s201sq/text.html на raw.githubusercontent.com

Средствами VBA пытаюсь удалить ярлык с панели быстрого запуска панели задач Windows 7. Пока не получается. Список иконок в windows 7 прописан по адресу:
C:\Users\Пользователь\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar

Однако удаление ярлыка по этому адресу и перезагрузка Проводника Windows приводит только к появлению на месте удаляемой из панели быстрого запуска иконки белого несвязанного с объектами ярлычка. В Windows 7 видимо TaskBar имеет самостоятельные методы удаления ярлыков. Где-то в интернете попался форум для C++, в котором упоминалось, что TaskBar является объектом класса Windows Shell. На данном ресурсе есть хорошая справочная статья про Shell
http://www.script-coding.com/WSH/Shell.html
, но для варианта Windows XP.

У Microsoft в документации есть упоминания про работу с TaskBar средствами .Net Framework
http://msdn.microsoft.com/ru-ru/library/system.windows.shell(v=vs.110).aspx
Но как получить доступ к объекту .Net Framework через VBA или VB6 - без понятия. Или может быть объект Shell в Windows 7 имеет больше методов и свойств?

Знающие люди, отзовитесь, помогите решить проблему удаления ярлыка с панели задач Windows 7


Я выполняю последовательный поиск всех ярлыков "mail.ru" и удаляю их из папок где они расположены, в том числе и из папки панели задач Windows 7:
У меня C:\Users\Home\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar


Вот кусок кода

FileName = Dir(Folders(i).path & "\*.lnk")

Do While FileName <> ""

If FileName <> "" Then

FullFileName = Folders(i).path & "\" & FileName

Set TextFile = FSO.getfile(FullFileName).OpenAsTextStream(1) 'Открываем файл для чтения

text = TextFile.ReadAll

TextFile.Close

If (InStr(LCase(FileName), "mail.ru") > 0) Or (InStr(LCase(text), "mail.ru") > 0) Then

DeletedCount = DeletedCount + 1'Счет удаленных объектов

Form1.Text1.text = Form1.Text1.text & "- удален ярлык " & FullFileName & vbCrLf

FSO.deletefile FullFileName, True

End If

End If

FileName = Dir()

Loop


В Folders(i) перебираются все папки диска C: Физически удаление происходит, проверил
Но этого пока не достаточно. Даже после перезагрузки Explorer хвост от ярлыка висит на панели задач.


По поводу поиска в гугле спасибо. Дело в том, что надо ещё уметь правильно составить поисковый запрос. Например запрос "VBA TaskBar icon delete" или "VBA remove taskbar icon" мне не помогли.
По вашему запросу нашел кое-что полезное. Там для удаления иконок используются кроме всего прочего объекты
ShellApp.NameSpace("C:\Users\UserName\Desktop").Items.Verbs и метод .verbs.DoIt
Нужно почитать про verbs, спасибо за подсказку


Сделал открепление иконки приложения от панели задач следующим образом

Public Function DeleteTaskbarIcon(ByVal FilePath As String, FileName As String) As Boolean

'Удаление иконки с панели быстрого запуска Windows 7
'FilePath для Windows 7 - C:\Users\ИмяПользователя\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar
'FileName - имя открепляемого ярлыка. Например Mail.Ru.lnk
'Возвращает признак успешности открепления ярлыка
Dim objShell, objFolder, colVerbs, objVerb
Dim text As String

DeleteTaskbarIcon = False ' Возвращаем False, если ярлык не закреплен на панели задач или команды на открепление в меню нет
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.NameSpace(FilePath & "\")
Set colVerbs = objFolder.ParseName(FileName).verbs

For Each objVerb In colVerbs
    text = LCase(Replace(objVerb.Name, "&", ""))
    'Команда на открепление иконки, взятая из контекстного меню чувствительна к языку операционной системы Windows
    If (InStr(text, "unpin") > 0) Or (InStr(text, "изъять") > 0) Or (InStr(text, "открепить") > 0) Then
        objVerb.DoIt 'Выполняем открепление
        DeleteTaskbarIcon = True 'Функция открепила иконку
    End If
Next

End Function

Есть один момент. Правда функция чувствительна к языку операционной системы. В данном случае будет работать только в английской и русской версиях Windows 7
Лучше, конечно, реализовать открепление через API, но так как на решение данной задачи и так потрачено более двух суток на Гугл, то пойдет и так.

 
MyTetra Share v.0.65
Яндекс индекс цитирования