bool showInWindowsShell(const QString &filePath, bool deselect) { QFileInfo appFI(filePath); auto matchPath = appFI.dir().path().toLower(); auto matchName = appFI.fileName().toLower(); QAxObject shellApp("Shell.Application"); QAxObject *windows = shellApp.querySubObject("Windows()"); windows->disableMetaObject(); auto count = windows->dynamicCall("Count()").toInt(); qDebug() << count; for (int i = 0; i < count; ++i) { QAxObject *win = windows->querySubObject("Item(QVariant)", {i}); win->disableMetaObject(); auto program = win->dynamicCall("FullName()").toString(); QFileInfo programFI(program); if (programFI.baseName().toLower() != "explorer") continue; auto url = win->dynamicCall("LocationURL()").toUrl(); if (!url.isLocalFile()) continue; auto path = url.path().mid(1).toLower(); if (path != matchPath) continue; QAxObject *doc = win->querySubObject("Document()"); QAxObject *folder = doc->querySubObject("Folder()"); folder->disableMetaObject(); QAxObject *folderItems = folder->querySubObject("Items()"); folderItems->disableMetaObject(); QAxObject *ourEntry = {}; int count = folderItems->dynamicCall("Count()").toInt(); for (int j = 0; j < count; j++) { QAxObject *entry = folderItems->querySubObject("Item(QVariant)", j); entry->disableMetaObject(); auto name = entry->dynamicCall("Name()").toString().toLower(); if (name == matchName) ourEntry = entry; } if (ourEntry) { if (false) ourEntry->dynamicCall("InvokeVerb(QVariant)", QVariant()); // open etc. auto rc = doc->dynamicCall("SelectItem(QVariant, int)", ourEntry->asVariant(), SVSI_SELECT | (deselect ? SVSI_DESELECTOTHERS : 0)); auto hwnd = win->dynamicCall("HWND()").toLongLong(); BringWindowToTop(HWND(hwnd)); return true; } } return false; }