2017-05-15 4 views
-1

Windowsショートカットは、リンクをクリックしたときに移動または名前が変更されたショートカットターゲットの現在の場所を取得するために、分散リンク追跡サービスを使用します。この場所をプログラムで取得する方法はありますか(C#)?C#でショートカットターゲットの現在の場所をプログラムで見つける方法はありますか?

+0

EXEが起動された場所を教えてください。 –

+0

「C#で」と言うと、P/Invokeが受け入れられないという意味ですか? – Anders

+0

場所はショートカットターゲットの場所です - 関連する.exeはありません。 .lnkファイルには一意のファイル識別子が格納されていて、Link Tracking Serviceの引数として使用されています。変更されていればターゲット位置を更新します。これは.lnkファイルにも格納されていると思います。これが必要な場合は、P/Invokeなどの場所を取得するためのメソッドを使用して喜んで – SimonKravis

答えて

1

はい。あなたはthis blog article by Jani Järvinenからコードを使用することができます。

class Program 
{ 

    [STAThread] 
    static void Main(string[] args) 
    { 
     const string shortcut = @"C:\test.lnk"; // Shortcut file name here 

     string pathOnly = System.IO.Path.GetDirectoryName(shortcut); 
     string filenameOnly = System.IO.Path.GetFileName(shortcut); 

     Shell32.Shell shell = new Shell32.Shell(); 
     Folder folder = shell.NameSpace(pathOnly); 
     FolderItem folderItem = folder.ParseName(filenameOnly); 
     if (folderItem != null) 
     { 
      Shell32.ShellLinkObject link = (Shell32.ShellLinkObject)folderItem.GetLink; 
      Console.WriteLine(link.Path); 
     } 

     Console.ReadKey(); 

    } 
} 
+0

残念ながら、この非常にエレガントなコードは、残念ながら.lnkファイル内の現在のストアドリンクのターゲットを取得します。ターゲットを移動または名前を変更した場合、返されるパスは変更されません。 – SimonKravis

0

Devil_coder /コーディーグレーで我慢したコードに小さなほかは何が必要ありません。 link.Resolveを次のように追加します。https://msdn.microsoft.com/en-us/library/windows/desktop/bb773996(v=vs.85).aspxに定義されたフラグ は現在のリンク先を返します。

Shell32.ShellLinkObject link = (Shell32.ShellLinkObject)folderItem.GetLink; link.Resolve(5); Console.WriteLine(link.Path);

+0

フラグ値(5 = 4(更新パス)+ 1(ダイアログを表示しない))を使用すると、存在しないターゲットへのパスを削除しないオプションが使用されます。ショートカットターゲットが移動または削除されたかどうかが表示され、ショートカットを削除するかどうかを尋ねられます。移動したターゲットが処理されるため、このダイアログは正しくありません。 – SimonKravis

関連する問題