📜  快捷方式图标 (1)

📅  最后修改于: 2023-12-03 15:39:35.434000             🧑  作者: Mango

快捷方式图标

快捷方式图标是用于表示计算机上快捷方式的图标。快捷方式图标既可以是系统内置的图标,也可以是用户自定义的图标。

系统内置图标

操作系统通常会内置一些常用的图标,如文件夹、文档、音频、视频等。程序员可以使用系统提供的API以及系统内置图标来创建自己的快捷方式。

Windows系统内置图标

Windows系统内置了一套图标资源,位于以下路径:

%SystemRoot%\system32\imageres.dll

这些图标可以通过以下API来获取:

SHGetStockIconInfo(SIID_APPLICATION, SHGSI_ICON, &sii);

其中,SIID_APPLICATION表示获取应用程序快捷方式的图标,SHGSI_ICON表示获取图标句柄。

macOS系统内置图标

macOS系统内置了一套图标资源,位于以下路径:

/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/

这些图标可以通过以下API来获取:

NSImage *image = [[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(kGenericFolderIcon)];

其中,kGenericFolderIcon表示获取文件夹的图标,NSFileTypeForHFSTypeCode将传入的文件类型码转换为文件类型。

Linux系统内置图标

Linux系统内置了一套图标资源,位于以下路径:

/usr/share/icons/

这些图标可以使用GTK+的API来获取:

GdkPixbuf* pixbuf = gdk_pixbuf_new_from_file("/usr/share/icons/hicolor/16x16/apps/gnome-panel-launcher.png", NULL);

其中,gnome-panel-launcher.png表示获取应用程序快捷方式的图标,16x16表示图标的大小,/usr/share/icons/hicolor/表示默认的图标路径。

用户自定义图标

程序员还可以为自己的应用程序创建自定义图标。在Windows系统下,可以使用Visual Studio自带的图标编辑器,或使用其他第三方图标编辑器。在macOS系统下,可以使用Xcode自带的图标编辑器Icon Composer。在Linux系统下,可以使用Inkscape等矢量图形编辑器来创建图标。

无论是系统内置图标还是用户自定义图标,都可以使用以下API将其设置为快捷方式的图标:

Windows系统
CoInitialize(NULL); // 初始化COM组件
IShellLink *psl;
HRESULT hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*)&psl);
if(SUCCEEDED(hr)) {
    IPersistFile *ppf;
    hr = psl->QueryInterface(IID_IPersistFile, (void**)&ppf);
    if(SUCCEEDED(hr)) {
        WORD wsz[MAX_PATH];
        MultiByteToWideChar(CP_ACP, 0, L".\\demo.lnk", -1, wsz, MAX_PATH);
        hr = ppf->Load(wsz, STGM_READWRITE);
        if(SUCCEEDED(hr)) {
            psl->SetIconLocation(L"C:\\myicon.ico", 0); // 设置图标
            ppf->Save(NULL, TRUE);
        }
        ppf->Release();
    }
    psl->Release();
}
CoUninitialize(); // 终止COM组件
macOS系统
NSWorkspace *workspace = [NSWorkspace sharedWorkspace];
NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"];
NSString *appPath = [[NSBundle mainBundle] bundlePath];
NSString *appIconPath = [appPath stringByAppendingPathComponent:@"Contents/Resources/MyApp.icns"];
NSURL *appURL = [NSURL fileURLWithPath:appPath];
[workspace setIcon:[[NSImage alloc] initWithContentsOfFile:appIconPath] forFile:[appURL path] options:0];
Linux系统
GError* error = NULL;
GFile* file = g_file_new_for_path("/usr/share/applications/myapp.desktop");
g_file_replace_contents(file, "[Desktop Entry]\nName=MyApp\nIcon=myapp\nType=Application\nExec=myapp\n", -1, NULL, FALSE, G_FILE_CREATE_REPLACE_DESTINATION, NULL, &error); // 将myapp设置为图标名称
if (error != NULL) {
    g_error_free(error);
    return -1;
}
GdkPixbuf* pixbuf = gdk_pixbuf_new_from_file("/usr/share/icons/hicolor/48x48/apps/inkscape.png", NULL); // 用inkscape来给myapp设置图标
if (pixbuf != NULL) {
    gboolean result = gdk_pixbuf_save(pixbuf, "/usr/share/icons/hicolor/48x48/apps/myapp.png", "png", &error, NULL);
    g_object_unref(pixbuf);
    if (!result) {
        if (error != NULL) {
            g_error_free(error);
        }
        return -1;
    }
}
总结

快捷方式图标是非常重要的一部分,它可以让用户方便地找到并打开应用程序。程序员可以根据系统内置图标或者用户自定义图标的需要来设置快捷方式的图标,并使用API将其应用到快捷方式中。无论哪种操作系统,都有一套适合的API或工具来完成这个任务。