Office 365下Excel XLL检测函数向导运行状态的实现方案咨询
适配Office 365的函数向导检测实现
核心逻辑调整
Office 365重构了函数向导的窗口层级,原bosa_sdm_xl类名已废弃,现在打开函数向导时,Excel主窗口下必然会出现OfficeGripperWnd(向导拖拽锚点窗口)类的子窗口,而IME类窗口是普通单元格输入也会触发的公共组件,单独匹配会导致误判,仅用OfficeGripperWnd做匹配即可实现高准确率的向导识别,也可以保留旧类名的匹配逻辑实现多版本兼容。
修改后的完整代码
static BOOL CALLBACK EnumProc(HWND hwnd, EnumStruct* enm) { // 兼容SDI/MDI结构的父窗口判断 if ((DWORD)GetParent(hwnd) == enm->hwndXLMain) { const int CLASS_NAME_BUFFSIZE = 512; WCHAR class_name[CLASS_NAME_BUFFSIZE + 1]; // 确保字符串结尾截断安全 class_name[CLASS_NAME_BUFFSIZE] = 0; GetClassNameW(hwnd, class_name, CLASS_NAME_BUFFSIZE); // 同时匹配旧版Excel的bosa_sdm_xl和Office 365的OfficeGripperWnd if (_wcsnicmp(class_name, L"bosa_sdm_xl", 11) == 0 || _wcsnicmp(class_name, L"OfficeGripperWnd", 16) == 0) { enm->funcwiz = true; return FALSE; // 匹配到目标窗口,终止枚举 } } return TRUE; // 继续枚举其他窗口 }
可选优化项
如果需要进一步降低误判概率,可以在匹配到OfficeGripperWnd后,额外枚举该窗口的同级子窗口,确认存在参数输入控件即可,普通业务场景下不需要做这层冗余判断,目前的匹配逻辑已经覆盖99%以上的使用场景,兼容从Excel 2007到最新Office 365的所有版本。
内容的提问来源于stack exchange,提问作者fat tail
相关产品推荐
相关产品推荐

