如何在运行时永久更改窗口图标?

时间:2017-07-17 12:51:33

标签: c++ winapi icons

我正在尝试允许我的应用程序的用户设置自己的自定义图标,但是通过LoadImage函数加载图标文件并通过WM_SETICON消息设置它似乎不起作用。 Windows资源管理器中的图标不会更新,每次运行程序时,任务栏和左上角的图标都会重置(用户必须再次设置它们)。我使用资源时没有出现这些问题,但是在编译程序后我无法更改.rc文件,是吗?我究竟做错了什么?我有一个菜单函数调用GetOpenFileName获取图标文件,然后通过LoadImage加载它并通过SendMessage设置。

这是我的代码(我跳过检查函数的返回值以缩短代码)

void DoFileIcon(HWND hwnd)
{
    OPENFILENAME ofn;
    char szFileName[MAX_PATH] = "";

    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = hwnd;
    ofn.lpstrFilter = "Icons (*.ico)\0*.ico\0All files (*.*)\0*.*\0";
    ofn.lpstrFile = szFileName;
    ofn.nMaxFile = MAX_PATH;
    ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
    ofn.lpstrDefExt = "ico";

    if(GetOpenFileName(&ofn))
    {
        HICON hIcon, hIconSm;
        hIcon = LoadImage(NULL, szFileName, IMAGE_ICON, 32, 32, 
        LR_LOADFROMFILE);
        SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)hIcon);
        hIconSm = LoadImage(NULL, szFileName, IMAGE_ICON, 16, 16, 
        LR_LOADFROMFILE);
        SendMessage(hwnd, WM_SETICON, ICON_SMALL, (LPARAM)hIconSm);
    }
}

1 个答案:

答案 0 :(得分:1)

通过Windows资源管理器中的图标,我假设您指的是shell与.exe文件关联的图标。这始终被确定为文件中的第一个图标资源。除非您准备允许修改.exe文件,否则您无法更改此内容。我强烈建议您在部署后不要修改.exe文件。这可能会导致损坏,并且会对反恶意软件软件产生怀疑。

对于与主窗口关联的图标,这很简单。您已经知道如何更改它,发送WM_SETICON消息。或者在注册窗口类时注册自定义图标。您的问题似乎只是您的程序在启动时既不会执行这些操作,而只会在您调用DoFileIcon时执行。系统不会为您记住自定义图标,您需要编写代码来执行此操作。将信息存储在注册表或应用程序配置文件中。然后在应用程序启动时,阅读此配置,并应用自定义图标。