c#でショートカットの日本語名を取得する

例えば、
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Accessories
をエクスプローラで開いてみ欲しい。

ペイント、電卓・・・等、日本語のショートカットが並んでいる。

このフォルダに対して、下記コードを実行する。

 var files = Directory.GetFiles(@"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Accessories", "*", SearchOption.AllDirectories);

取得結果は、
ペイント => C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Accessories\Paint.lnk
電卓 => C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Accessories\Calculator.lnk

あれ?
そ、そんな!!
あ…ありのまま 今 起こった事を話すぜ!
僕の網膜には、ペイントって文字が写っているのに
実際はPaint.lnkだと!?


どうも、こういう事らしい
http://snow-white.cocolog-nifty.com/first/2010/01/windows-7-8b1c.html


諸事情あって、僕は"ペイント"とか"電卓"って文字列が欲しいのです。
まいったね。嵌ったね。恐怖したね。


ってわけで、解決策。
まず参照設定で Microsoft Shell Controls And Automation を追加します。
んで、

using Shell32;

を追加します。

そしたら、

var path = @"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Accessories\Paint.lnk";
var dirNm = Path.GetDirectoryName(path);
var fileNm = Path.GetFileName(path);

var shell = new Shell();
var f = shell.NameSpace(dirNm);
var item = f.ParseName(fileNm);

var jpName = item.Name;

で日本語名が取得できます。
ふぅ。。