8

Windows ショートカット (.lnk) ファイルからアイコンを抽出する必要があります (または、アイコン ファイルがショートカットによってポイントされている場合は、アイコン ファイルを検索します)。

exeやdllなどからアイコンを抽出することについて質問しているわけではありません。インストールプログラムを実行すると、問題のショートカットが作成されます。また、ショートカットによって表示されるアイコンは、ショートカットが指す.exeには含まれていません。おそらく、アイコンが .lnk ファイルに埋め込まれているか、.lnk ファイルにこのアイコンが存在する場所へのポインタが含まれています。しかし、私が見つけたユーティリティはどれもこれに対処していません-それらはすべて.exeに移動するだけです。

どうもありがとう!

4

6 に答える 6

7

リンクにアクセスするShell32メソッドの使用:

String lnkPath = @"C:\Users\PriceR\Desktop\Microsoft Word 2010.lnk";
//--- run microsoft word
var shl = new Shell32.Shell();         // Move this to class scope
lnkPath = System.IO.Path.GetFullPath(lnkPath);
var dir = shl.NameSpace(System.IO.Path.GetDirectoryName(lnkPath));
var itm = dir.Items().Item(System.IO.Path.GetFileName(lnkPath));
var lnk = (Shell32.ShellLinkObject)itm.GetLink;
//lnk.GetIconLocation(out strIcon);
String strIcon;
lnk.GetIconLocation(out strIcon);
Icon awIcon = Icon.ExtractAssociatedIcon(strIcon);
this.button1.Text = "";
this.button1.Image = awIcon.ToBitmap();
于 2012-11-26T23:31:37.717 に答える
6

このスレッドは、.lnk ファイルに含まれるデータに関する興味深い情報を提供します

sSHGetFileInfoss関数は、アイコン ファイルを抽出できる必要があります

ここに文書化され、lnk ファイルに使用されます。

Path2Link := 'C:\Stuff\TBear S Saver.lnk';
SHGetFileInfo(PChar(Path2Link), 0, ShInfo1, SizeOf(TSHFILEINFO),
          SHGFI_ICON);
// this ShInfo1.hIcon will have the Icon Handle for the Link Icon with
// the small ShortCut arrow added}

最初のリンクから、この関数を次のように宣言する C# でそのようなユーティリティを構築できます。

[DllImport("shell32.dll")]
public static extern IntPtr SHGetFileInfo(
   string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, 
   uint cbSizeFileInfo, uint uFlags);

次のように宣言された関数を使用するautoit script languageでユーティリティを構築することもできます。

Func _ShellGetAssocIcon(Const $szFile,Const $IconFlags = 0)
    Local $tFileInfo = DllStructCreate($tagSHFILEINFO)
    If @error Then
        Return SetError(1,@extended,0)
    EndIf

    Local $Ret = DllCall("shell32.dll","int","SHGetFileInfo","str",$szFile,"dword",0, _
        "ptr",DllStructGetPtr($tFileInfo),"uint",DllStructGetSize($tFileInfo),"uint",BitOr($SHGFI_ICON,$IconFlags))
    MsgBox(0,0,@error)
    Return DllStructGetData($tFileInfo,"hIcon")
EndFunc
于 2008-12-05T08:36:18.013 に答える
2

2010 年、Microsoft は最終的に LNK ファイル形式の公式仕様をリリースしました。もちろん、ネット上に出回っているリバースエンジニアリングされた仕様よりもはるかに正確で詳細です。

完全を期すために、シェル リンクとショートカットの MSDN の説明を次に示します

于 2011-08-26T11:43:04.153 に答える
1

.lnk ファイルを自分で解析することもできます。ショートカット ファイル形式の詳細については、この pdfまたはこの記事を参照してください。

または、この質問への回答に記載されている ShellLink クラスを使用できます。

于 2008-12-05T09:13:20.293 に答える
0

おそらくアプリケーションのアイコンではなく、左下隅にショートカットがあるアイコンではなく、これにいくつかのリソースを追加するには:

于 2009-09-14T10:59:39.520 に答える