# 第 ⑦ 章 · 信息提示处理器（IQueryInfo）

> 用 IQueryInfo 定制鼠标悬停文件时的提示文字；以及不写代码、用 InfoTip 属性列表字符串的更省事替代。

- 作者：David（道雾轩）
- 专栏：Windows Shell 扩展指南（https://daiw.org/manual/windows-shell-ext.md）
- 最后更新：2026-07-11
- 原文：https://daiw.org/manual/windows-shell-ext/infotip
- 转载与引用：请注明出处并附原文链接（https://daiw.org/about/copyright）

**信息提示（infotip）**就是鼠标停在文件上时浮出来的那段说明。定制它有两条路：写一个 `IQueryInfo` 处理器，或者干脆不写代码、用一行注册表配置。

配套代码：[`07-infotip`](https://github.com/davidapp/shell-extension-demos/tree/main/07-infotip)。

## 写处理器：IQueryInfo

接口很小，核心就一个方法 `GetInfoTip`：

```cpp title="QueryInfoHandler.cpp（节选）"
IFACEMETHODIMP QueryInfoHandler::GetInfoTip(DWORD, PWSTR* ppwszTip) {
    ULONGLONG size = /* GetFileAttributesEx 取 m_szFile 大小 */;
    wchar_t tip[MAX_PATH + 128];
    StringCchPrintfW(tip, ARRAYSIZE(tip),
        L"Shell 扩展示例\n路径：%s\n大小：%llu 字节", m_szFile, size);
    return SHStrDupW(tip, ppwszTip);   // CoTaskMemAlloc 分配，Shell 负责释放
}
```

文件路径照例通过 `IPersistFile::Load` 拿到。注册在 ProgID 的 `shellex\{00021500-0000-0000-C000-000000000046}`（信息提示处理器的固定类别 GUID）下。

<Callout type="warn">
  返回的字符串务必用 `CoTaskMemAlloc`（`SHStrDupW` 即是）；用 `new`/`malloc` 会让 Shell 释放时崩溃。提示里可以用 `\n` 换行。
</Callout>

## 不写代码：InfoTip 属性字符串

很多时候根本不用写 DLL。在文件类型的 ProgID 下加一个 `InfoTip` 值，用 `prop:` 前缀列出要显示的属性，Shell 就会用属性系统自动拼出提示：

```
HKEY_CLASSES_ROOT\txtfile
    InfoTip = prop:System.ItemType;System.Size;System.DateModified
```

这套 `prop:` 语法直接复用第 ⑥ 章的属性系统——属性处理器暴露的字段，这里都能列。**能用属性字符串解决的，就别写 `IQueryInfo`。** 只有当提示内容需要**动态计算**（不是现成属性）时，才值得写处理器。

## 参考

- [IQueryInfo](https://learn.microsoft.com/zh-cn/windows/win32/api/shlobj_core/nn-shlobj_core-iqueryinfo)
- [信息提示定制（InfoTip 字符串）](https://learn.microsoft.com/zh-cn/windows/win32/shell/handlers#infotip-customization)
