第 ⑦ 章 · 信息提示处理器(IQueryInfo)

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

作者 David更新于

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

配套代码:07-infotip。

写处理器:IQueryInfo

接口很小,核心就一个方法 GetInfoTip:

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)下。

返回的字符串务必用 CoTaskMemAlloc(SHStrDupW 即是);用 new/malloc 会让 Shell 释放时崩溃。提示里可以用 \n 换行。

不写代码:InfoTip 属性字符串

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

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

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

参考

本页目录