- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为任何文件获取一个图标(如 HICON),以与资源管理器完全相同的方式绘制它。这意味着如果我有一个 exe 文件的路径,我应该绘制它的默认图标。如果我有一个链接 (.lnk) 文件,我必须绘制一个图标,分配给该链接(如果有),否则绘制其目标文件图标。
不幸的是,应该返回图标的 SHGetFileInfo() 对于多个链接文件不起作用。这是代码:
SHFILEINFO fi = {0};
::SHGetFileInfo(L"C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Windows Mobile Device Center.lnk",
//::SHGetFileInfo(L"C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\TortoiseGit\\TortoiseGitMerge.lnk",
0, &fi, sizeof(fi), SHGFI_ICON /*| SHGFI_SMALLICON*/);
CPaintDC dc(this);
dc.DrawIcon(0, 0, fi.hIcon);
第一个文件呈现如下(正确):
第二个渲染如下(不正确):
但是资源管理器将其呈现为:
我尝试过 SHGFI_SMALLICON 修饰符,但没有成功。如何获取这两种情况的图标?或者也许还有其他功能可以完成此任务?
更新
问题是应用程序是 x86,操作系统是 x64。有没有办法解决它不分支到 2 个版本的问题?
最佳答案
如果你确实想获得与 Explorer 相同的行为,那么你需要使用与 Explorer 使用的相同的 Shell 接口(interface),例如 IExtractIcon
和 IExtractImage
:
There are two ways to retrieve an object's icon. The simplest way is to call SHGetFileInfo. However, this approach is inflexible and may be slow. A more flexible and efficient way to retrieve an item's icon is to use IExtractIcon. The Shell uses IExtractIcon to retrieve icons when it displays the contents of a folder. To use IExtractIcon to retrieve an object's icon, do the following:
- Get a pointer to the IShellFolder interface of the folder that contains the object.
- Call IShellFolder::GetUIObjectOf with the pointer to an item identifier list (PIDL) of the object and the interface ID of IExtractIcon (IID_IExtractIcon). The folder creates an object to handle the icon extraction, and returns the object's IExtractIcon interface pointer.
- Call IExtractIcon::GetIconLocation to retrieve the icon's location.
- Call IExtractIcon::Extract to retrieve the icon's handle.
Use IExtractImage if you are implementing a view of namespace objects, and want to display thumbnail images. You can use a Shell folder's IShellFolder::GetUIObjectOf method to bind to its IExtractImage interface.
请记住,Shell 中的所有内容均由 PIDL 表示,因此可以通过 IShellFolder
访问以及相关接口(interface)。
您可以使用 SHParseDisplayName()
将路径和文件名转换为绝对 PIDL ,然后使用 SHBindToParent()
获取其父文件夹的 IShellFolder
.
关于winapi - SHGetFileInfo() 返回错误的 HICON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26843464/
作为一个更大项目的一部分,我试图从现有的 HICON 创建一个 HICON,首先将该图标绘制到 HBITMAP,然后将其转换回 HICON。 (这将允许我修改图标,例如,通过在其上绘制文本。) 不幸的
我想在系统托盘中显示一个图标。 看起来应该这么简单,但我不知道如何创建一个 HICON 并绘制它!所有“兼容位图”、“兼容 DC”等东西让我很困惑。 如何绘制图标? 最佳答案 无需过多介绍,您可以使用
我正在尝试为任何文件获取一个图标(如 HICON),以与资源管理器完全相同的方式绘制它。这意味着如果我有一个 exe 文件的路径,我应该绘制它的默认图标。如果我有一个链接 (.lnk) 文件,我必须绘
我有一个由 HICON 标识的图标我想以自定义控件为中心绘制的句柄。 如何确定图标的大小以便计算正确的绘图位置? 最佳答案 这是一个 C++ 版本的代码: struct MYICON_INFO {
我有一个 HICON,我想将其用作另一个 HICON 的叠加层,以创建结果 HICON。结果 HICON 然后将用于“所有者绘制”控件(注意:它不使用图像列表)。覆盖图标具有透明颜色 RGB(0, 2
我使用 minGW 和 eclipse。我用这种方式制作了 HICON: case WM_CREATE: { ... hIcon = (HICON)LoadImage(NULL, "icon.ico"
我正在使用不支持 DPI 的按钮。我在我的代码中到处都在使用它,所以理想情况下我想在该按钮的 SetIcon 中添加几行。 SetIcon 方法(不出所料)将 HICON 作为参数 - 我想根据 DP
我在内存中有一个 .ico 文件的内容作为 const char*,我希望从中创建一个 HICON数据。我目前的做法是将数据写入一个临时文件,然后使用LoadImage。是否可以直接从内存中创建图标?
我们有什么方法可以将 HICON 或 HCURSOR 转换为字节数组,我用谷歌搜索了所有方法我没有找到一个通用的解决方案,下面我尝试转换HICON 颜色和掩码 BITMAP 到字节数组并通过套接字发送
我想定义 Win32 窗口的应用程序图标,例如通过使用 GCL_HICON 调用 SetClassLong 并将句柄传递给图标(参见 MSDN 上的 SetClassLong Function)。 这
我在内存中有一个 PNG 编码的图标作为字节数组。从这个字节数组创建 HICON 对象的推荐方法是什么? 假想的加分,如果你知道没有 ATL 或 GDI+ 的解决方案...:) 最佳答案 HGLOBA
我正在使用 IShellItemImageFactory 来提取文件的图标。我能够成功提取它并在对话框中使用SendDlgItemMessage(hDlg,IDC_STATIC2, STM_SETIM
我的最终目标是在JNA库的帮助下获得Java中HWND的图标。一切工作正常,除了一件重要的事情:我需要图标的大小以便在 Java 中进行进一步的处理步骤。 看来我无法要求尺寸。我总是得到大小 0x0。
我正在尝试从系统中获取图标。通过使用 SHGetFileInfo 我得到了 HICON, 我用下面的代码测试了这个 HICON: SHFILEINFO info; //For getting i
我正在从 .exe/.dll 中提取一个图标,并想将其保存在一个 .ico 文件中。执行此操作的最佳方法是什么? 我尝试使用 ::OleCreatePictureIndirect(),然后使用 IPi
对于 x64 目标构建,从“OLE_HANDLE”转换为“HICON”的正确方法是什么? 特别是对于普通的 C 风格转换,我在使用 x64 配置编译时收到此警告: 警告 C4312:“类型转换”:从“
我知道已经有一个 question like this .但它的解决方案不适合我,因为使用 Sehellfolder Methode 你只能得到 16x16 和 32x32 大小的图标。我提取了一个大
如何在VC++中将HICON转成HBITMAP? 我知道这是一个常见问题解答,但我在 Google 上找到的所有解决方案都不起作用。我需要的是一个接受参数 HICON 并返回 HBITMAP 的函数。
我正在开发一个 C/S 应用程序,C++ 中的服务器和 C# 中的客户端,我需要发送一些有关当前正在运行的进程和相关图标的信息。感谢 EnumWindows 我得到了图标文件,回调中有这段代码...
我正在尝试将一些 PNG 图像加载到 WinAPI ImageList 中,作为要在 ListView 中显示的元素的图标。我用 Gdiplus 做这个,我遇到的问题是质量很差。就像颜色深度减少了之类
我是一名优秀的程序员,十分优秀!