Как нарисовать элемент в окне рабочего стола Windows с Win32 SDK

У меня есть файл в окне рабочего стола Windows. Я хочу нарисовать его на заказ вместо обычного значка и текста. Я почти реализую это с помощью следующих шагов: 1. создайте dll, в которой реализован интерфейс IExtractIcon, затем зарегистрируйте расширение оболочки обработчика значков для файла, чтобы сделать dll загруженным explorer.exe. 2. в функции dllmain библиотеки dll создайте подкласс в окне рабочего стола для создания пользовательского чертежа.

Это почти сработало, но все еще есть некоторые проблемы: 1. В winxp dll загружается только один раз. после перезагрузки ПК, DLL не будет загружен, за исключением того, что я создал другой файл с тем же расширением. Я думаю, причина в том, что рабочий стол кешировал иконку, поэтому ему не нужно загружать dll для извлечения иконок. Но почему win7 работает. Что я могу сделать, чтобы система всегда загружала dll?

  1. Файл всегда имеет расширение в файловой системе, но когда он отображается на рабочем столе, расширение может не отображаться. Как я могу получить полное имя файла в соответствии с элементом списка рабочего стола?

или есть другой способ заставить файл explorer.exe автоматически загружать мою dll?

вот код IExtractIcon:

HRESULT CShellIcon::GetIconLocation(UINT uFlags, LPWSTR szIconFile, UINT cchMax, LPINT piIndex, UINT* pwFlags)
{ 
    // I inject the dll to subclass the desktop window
    SubclassDesktop();

    *piIndex = 0; 

    *pwFlags = GIL_DONTCACHE | GIL_NOTFILENAME | GIL_PERINSTANCE;
    return S_FALSE;
} 

HRESULT CShellIcon::Extract(LPCTSTR pszFile, UINT nIconIndex, HICON* phiconLarge, HICON* phiconSmall, UINT nIconSize )
{ 
    phiconLarge = NULL;
    phiconSmall = NULL;
    return S_OK; 
}

0 ответов

Другие вопросы по тегам