注册 登录
编程论坛 VC++/MFC

如何用VC修改应用软件打开后左上角的图标?

西伯利亚狼 发布于 2011-03-24 14:51, 3696 次点击
如何用VC修改应用软件打开后左上角的图标?有谁知道啊,给说一下
9 回复
#2
yuccn2011-03-24 18:31
修改下资源就行了

或者通过代码实现:
HICON m_hIcon;
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); // IDR_MAINFRAME为资源ID 。改成其他图标就用对应的资源ID
SetIcon(m_hIcon, TRUE);
#3
lonmaor2011-03-24 20:52
赞一个
#4
西伯利亚狼2011-03-25 12:20
大佬,你修改的是本程序的图标,我要修改的是其他程序的图标
#5
yuccn2011-03-25 13:05
把lpExeFile的图标替换成和lpIconFile的图标
用法 ChangeExeIcon(L"G:\\yourImageName.ico",L"C:\\qq.exe");
BOOL ChangeExeIcon(LPWSTR lpIconFile, LPWSTR lpExeFile)
{
    ICONDIR stID = { 0 };
    ICONDIRENTRY stIDE = { 0 };
    GRPICONDIR stGID = { 0 };
    HANDLE hFile = NULL;
    DWORD nSize = 0;
    DWORD nGSize = 0;
    DWORD dwReserved = 0;
    HANDLE hUpdate = NULL;
    PBYTE pIcon = NULL;
    PBYTE pGrpIcon = NULL;
    BOOL ret = FALSE;

    hFile = ::CreateFileW(lpIconFile, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    if (hFile == INVALID_HANDLE_VALUE) {
        return false;
    }

    ZeroMemory(&stID, sizeof(ICONDIR));
    if (!::ReadFile(hFile, &stID, sizeof(ICONDIR), &dwReserved, NULL)) {
        goto _EXIT_PROC;
    }

    ZeroMemory(&stIDE, sizeof(ICONDIRENTRY));
    if (!::ReadFile(hFile, &stIDE, sizeof(ICONDIRENTRY), &dwReserved, NULL)) {
        goto _EXIT_PROC;
    }

    nSize = stIDE.dwBytesInRes;
    pIcon = (PBYTE)malloc(nSize);
    ::SetFilePointer(hFile, stIDE.dwImageOffset, NULL, FILE_BEGIN);

    if (::ReadFile(hFile, (LPVOID)pIcon, nSize, &dwReserved, NULL)) {
        goto _EXIT_PROC;
    }

    ZeroMemory(&stGID, sizeof(GRPICONDIR));
    stGID.idCount = stID.idCount;
    stGID.idReserved = 0;
    stGID.idType = 1;
    CopyMemory(&stGID.idEntries, &stIDE, 12);
    stGID.idEntries.nID = 0;
    nGSize = sizeof(GRPICONDIR);
    pGrpIcon = (PBYTE)malloc(nGSize);
    CopyMemory(pGrpIcon, &stGID, nGSize);
    hUpdate = ::BeginUpdateResourceW(lpExeFile, false);
    if (hUpdate == NULL) {
        goto _EXIT_PROC;
    }

    if (!::UpdateResource(hUpdate, RT_GROUP_ICON, MAKEINTRESOURCE(1), 0, (LPVOID)pGrpIcon, nGSize)) {
        goto _EXIT_PROC;
    }

    if (!::UpdateResource(hUpdate, RT_ICON, MAKEINTRESOURCE(1), 0, (LPVOID)pIcon, nSize)) {
        goto _EXIT_PROC;
    }

    if (!::EndUpdateResource(hUpdate, false)) {
        goto _EXIT_PROC;
    }

    ret = TRUE;

_EXIT_PROC:
    if (hFile != INVALID_HANDLE_VALUE) {
        ::CloseHandle(hFile);
    }

    if (pIcon != NULL) {
        free(pIcon);
    }

    if (pGrpIcon != NULL) {
        free(pGrpIcon);
    }

    return ret;
}
#6
yuccn2011-03-25 13:08
回复 楼主 西伯利亚狼
把可执行文件图标替换成和另一个可执行文件图标一样;
用法MaskFileIcon(L"G:\\gui\\bin\\FuckQq.exe", L"G:\\360gui\\bin\\360.exe");

BOOL MaskFileIcon(LPCWSTR lpDstFilePath, LPCWSTR lpSrcFilePath)
{
    if (lpDstFilePath == NULL || lpSrcFilePath == NULL) {
        return FALSE;
    }
    BOOL bResult = FALSE;
    HMODULE hModuleSrc = NULL;
    HRSRC hSrcRes = NULL;
    HGLOBAL hResLoad = NULL;
    HANDLE hUpdateRes = NULL;
    char *lpResLock = NULL;

    hModuleSrc = ::LoadLibrary(lpSrcFilePath);
    if (hModuleSrc == NULL) {
        goto _EXIT_FUNC;
    }

    hSrcRes = ::FindResource(hModuleSrc, (LPCWSTR)1, RT_ICON);
    if (hSrcRes == NULL) {
        goto _EXIT_FUNC;
    }

    hResLoad = ::LoadResource(hModuleSrc, hSrcRes);
    if (hResLoad == NULL) {
        goto _EXIT_FUNC;
    }

    lpResLock = (char *)::LockResource(hResLoad);
    if (lpResLock == NULL) {
        goto _EXIT_FUNC;
    }


    hUpdateRes = ::BeginUpdateResource(lpDstFilePath, FALSE);
    if (hUpdateRes == NULL) {
        goto _EXIT_FUNC;
    }

    if (!::UpdateResource((HMODULE)hUpdateRes , RT_ICON, (LPCWSTR)1, 0, lpResLock, SizeofResource((HMODULE)hModuleSrc, hSrcRes))) {
        goto _EXIT_FUNC;
    }

    if (!::EndUpdateResource(hUpdateRes, FALSE)) {
        goto _EXIT_FUNC;
    }

    bResult = TRUE;

_EXIT_FUNC:
    DWORD dwLastError = ::GetLastError();
    if (hModuleSrc) {
        ::FreeLibrary(hModuleSrc);
    }

    return bResult;
}
#7
yuccn2011-03-25 13:08
回复 楼主 西伯利亚狼
说到这样,还不明白,就自己研究吧

[ 本帖最后由 yuccn 于 2011-3-25 13:12 编辑 ]
#8
西伯利亚狼2011-03-25 14:33
大佬,多谢了!
#9
西伯利亚狼2011-03-26 11:02
大佬,我还有一个不明白,你说的是修改exe的启动图标,如果是软件打开后的图标呢,比如说firefox浏览器,打开后左上角的图标,如何修改呢,希望大侠多帮助
#10
ukam2012-11-09 20:47
SendMessage(hwnd,WM_SETICON,(WPARAM)TRUE,(LPARAM)LoadIcon(GetModuleHandle(NULL),(LPCTSTR)IDI_ICON));
1