第 ⑦ 章 · 信息提示处理器(IQueryInfo)
用 IQueryInfo 定制鼠标悬停文件时的提示文字;以及不写代码、用 InfoTip 属性列表字符串的更省事替代。
作者 David更新于
**信息提示(infotip)**就是鼠标停在文件上时浮出来的那段说明。定制它有两条路:写一个 IQueryInfo 处理器,或者干脆不写代码、用一行注册表配置。
配套代码:07-infotip。
写处理器:IQueryInfo
接口很小,核心就一个方法 GetInfoTip:
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。 只有当提示内容需要动态计算(不是现成属性)时,才值得写处理器。