どうもミツシマです。


今回はコマンド(VBS)でタスクバーにピン留めされたプログラムを変更出来ないかを検証してみました。


検証環境は以下の通り
仮想環境:Virtual Box 5.2.22
PC:WIndows10 1809 64bit
PC:Windows7 32bit


最終的にコマンドでやりたいことは、タスクバーに既存でピン留めされているプログラムを外し、任意のプログラムをピン留めすること。


ですが、結果から伝えるとWindows10ではタスクバーからピン留めを外すことは出来ても、タスクバーへのピン留めをコマンドで実施するのは困難(多分、普通のやり方では無理)でした。。。。orz
同じことをやろうとしている人の手間を少なくするためにも、なぜ難しいのかを記載します。
※誰かやり方を見つけた人がいたら教えて欲しいです!!!


まずタスクバーにピン留めする(orピン留めから外す)場合、レジストリ操作等では難しい為COMオブジェクトのshellオブジェクトの「Verb(InvokeVerb)」メソッドを使うことが考えられます。

自分も詳しい訳ではないので、間違っているかもしれませんがshellオブジェクトとはWindowsのエクスプローラ機能を呼び出しています。
そして「Verb(InvokeVerb)」メソッドは右クリックで表示されるメニューを実行するコマンドになります。

なので、タスクバーにピン留めしたいプログラム(ショートカット)を右クリックして、「Verb(InvokeVerb)」メソッドより「タスクバーにピン留め」すればいいのではないかと考えました。


実際にIEをタスクバーへピン留めする際のVBSの例が以下のとおりです。

===
Const Conpath1 = "C:¥Users¥ユーザー名¥AppData¥Roaming¥Microsoft¥Windows¥Start Menu¥Programs¥Accessories"

Set wShell = Wscript.CreateObject("Shell.Application")
Set Fol = wShell.NameSpace(Conpath1)
Set FolItem = Fol.ParseName("Internet Explorer.lnk")
For Each verb In FolItem.Verbs
If Instr(verb.name,"タスク") <> 0 Then
verb.DoIt
End If
Next
===

が、実際には全然上手く行かない。。。。
なぜかを色々と追求してみると、上記のコマンドで呼び出そうとしている右クリックのメニュー一覧に「タスクバーにピン留めする」という項目が見つからない!!!!
※既にタスクバーにピン留めされているプログラムで実行すると、「タスクバーからピン留めを外す」という項目は見つかる!!!
シェル画面


見にくいかもしれないが、1回目がIEがまだタスクバーにピン留めされていない状態でのコマンド実行で、2回目がタスクバーにピン留めされている状態でのコマンド実行した結果。
見ての通り、本来右クリックメニューで表示されるはずの「タスクバーにピン留めする」という項目が表示されない(あるいはシェル上から呼び出せない)
項目にないのだから、シェルオブジェクトからやろうとしても出来ないのは当たり前というのが理由である。


ちなみにWindows7ではどうかを確認してみた。
こちらはPowershell入れるのが面倒だったので、下記VBSで中身を確認してみた

===
Const Conpath1 = "C:\Users\administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs"

Set wShell = Wscript.CreateObject("Shell.Application")
Set Fol = wShell.NameSpace(Conpath1)
Set FolItem = Fol.ParseName("Internet Explorer.lnk")

For Each verb In FolItem.Verbs
Wscript.echo verb.name
Next
===

実行結果は以下の通り

スクリーンショット 2019-04-14 22.44.49

すいません、さっきの検証とは逆で1回目がタスクバーに既にピン留めされている状態での実行で、2回めがタスクバーにピン留めされていない状態でのコマンド実行です。
Windows7だと「ピン留め」ではなく「表示」という項目でちゃんと出てる!!!!

以下のVBSで実際にコマンドでピン留め出来るかを検証

===
Const Conpath1 = "C:\Users\administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs"

Set wShell = Wscript.CreateObject("Shell.Application")
Set Fol = wShell.NameSpace(Conpath1)
Set FolItem = Fol.ParseName("Internet Explorer.lnk")

For Each verb In FolItem.Verbs
If Instr(verb.name,"タスク") <> 0 Then
verb.DoIt
End If
Next
===

バッチリ出来た〜〜〜〜(T_T)
ということでWindows7で出来ていたことをWindows10でやろうとすると出来なくなっているということです。
仕様変更でshellオブジェクトから上手く呼び出せなくなってるのかな〜〜〜???
スポンサードリンク