1

Тема: VBA: Объект Shell для Windows 7

Здравствуйте
Средствами 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

2

Re: VBA: Объект Shell для Windows 7

Средствами VBA пытаюсь удалить ярлык с панели быстрого запуска панели задач Windows 7. Пока не получается.

Покажите Ваш код.

На данном ресурсе есть хорошая справочная статья про Shell
http://www.script-coding.com/WSH/Shell.html
, но для варианта Windows XP.

Ничего особенно не поменялось.

Чем Вас не устраивает VBA Unpin from taskbar - Поиск в Google?

3

Re: VBA: Объект Shell для 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, спасибо за подсказку

4

Re: VBA: Объект Shell для Windows 7

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

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, но так как на решение данной задачи и так потрачено более двух суток на Гугл, то пойдет и так.