예제 #1
0
bool checkAssociation(const QString & extension)
{
    if(!isSupportAssociation()) return false;

#ifndef Q_WS_WIN
    return false;
#else

    /*! The HKEY_CLASSES_ROOT subtree is a view formed by merging
     *  HKEY_CURRENT_USER\Software\Classes and
     *  HKEY_LOCAL_MACHINE\Software\Classes
     */
    QSettings RegCR("HKEY_CLASSES_ROOT", QSettings::NativeFormat);
    QSettings RegCU("HKEY_CURRENT_USER", QSettings::NativeFormat);

    QString ext("." + extension);
    QString ProgID = makeProgID(extension);

    QString fileName = QFileInfo(qApp->applicationFilePath()).fileName();
    QString FileExtsKey = QString("Software/Microsoft/Windows/CurrentVersion/Explorer/FileExts/") + ext;
    /// Windows 7:"/UserChoice/Progid" ;   XP: "/Progid"
    QString CurClassId = (QSysInfo::WindowsVersion >= QSysInfo::WV_VISTA)
            ? RegCU.value(FileExtsKey + "/UserChoice/Progid").toString()
            : RegCU.value(FileExtsKey + "/Progid").toString();
    QString CurAppId = RegCU.value(FileExtsKey + "/Application").toString(); /// Windows XP

    bool isRegistered = false;
    if (QSysInfo::WindowsVersion >= QSysInfo::WV_NT){
        if (!CurClassId.isEmpty()) {
            isRegistered = (CurClassId == ProgID) || (0 == CurClassId.compare(fileName, Qt::CaseInsensitive))
                    || (0 == CurClassId.compare(QString("Applications\\%1").arg(fileName), Qt::CaseInsensitive));
        }else if (!CurAppId.isEmpty()){
            //If user uses Open With..., explorer creates it's own ClassId under Application, like "smplayer.exe"
            isRegistered = (CurAppId == ProgID) || (0 == CurAppId.compare(fileName, Qt::CaseInsensitive));
        }else{
            //No classId means that no associations exists in Default Programs or Explorer
            //Check the default per-user association
            isRegistered = (RegCU.value("Software/Classes/" + ext + REG_DEFAULT).toString() == ProgID);
        }
    }

    //Finally, check the system-wide association
    //若CurClassId或CurAppId不为空,说明用户在“打开方式”中选择了其他程序,优先级高,会覆盖其他设置。
    if (!isRegistered && CurClassId.isEmpty() && CurAppId.isEmpty())
        isRegistered = (RegCR.value(ext + REG_DEFAULT).toString() == ProgID);

    return isRegistered && hasProgID(ProgID);

#endif  // Q_WS_WIN
}
예제 #2
0
static bool hasProgID(const QString &ProgID)
{
    QSettings RegCR("HKEY_CLASSES_ROOT", QSettings::NativeFormat);
    QSettings RegCU("HKEY_CURRENT_USER", QSettings::NativeFormat);

    RegCU.beginGroup("Software/Classes");

    QString key = ProgID + "/shell/open/command/.";
    QString appPath = qApp->applicationFilePath();
    appPath.replace('/', '\\');
    QString expect = QString("\"%1\" \"%2\"").arg(appPath, "%1"); // If it is set file association by this app, the value of key @key will be like this.

    if (RegCR.childGroups().contains(ProgID)) {
        return RegCR.value(key).toString() == expect;
    } else if (RegCU.childGroups().contains(ProgID)) {
        return RegCU.value(key).toString() == expect;
    } else {
        return false;
    }
}
예제 #3
0
//Associates all extensions in the fileExtensions list with current app.
//Returns number of extensions processed successfully.
int WinFileAssoc::CreateFileAssociations(const QStringList &fileExtensions)
{
    if (QSysInfo::WindowsVersion == QSysInfo::WV_VISTA) {
        return VistaSetAppsAsDefault(fileExtensions);
    }

    QSettings RegCR("HKEY_CLASSES_ROOT", QSettings::NativeFormat);  //Read only on NT+
    QSettings RegCU("HKEY_CURRENT_USER", QSettings::NativeFormat);

    if (!RegCU.isWritable() || RegCU.status() != QSettings::NoError)
        return 0;

    if (RegCR.status() != QSettings::NoError)
        return 0;

    if (QSysInfo::WindowsVersion < QSysInfo::WV_NT && !RegCR.isWritable())	//Win98
        return 0;

    //Check if classId exists in the registry
    if (!RegCR.contains(m_ClassId) && !RegCU.contains("Software/Classes/" + m_ClassId)) {
        //If doesn't exist (user didn't run the setup program), try to create the ClassId for current user.
        if (!CreateClassId(QApplication::applicationFilePath(), "SMPlayer2 Media Player"))
            return 0;
    }

    int count = 0;
    foreach(const QString & fileExtension, fileExtensions) {
        QString ExtKeyName = QString("Software/Microsoft/Windows/CurrentVersion/Explorer/FileExts/.%1").arg(fileExtension);
        QString ClassesKeyName = m_ClassId;

        QString BackupKeyName = ClassesKeyName + "/" + fileExtension;
        QString CUKeyName = "Software/Classes/." + fileExtension;

        //Save current ClassId for current user
        QString KeyVal = RegCU.value(CUKeyName + "/.").toString();

        if (KeyVal.length() == 0 || KeyVal == m_ClassId) {
            //No registered app for this extension for current user.
            //Check the system-wide (HKEY_CLASSES_ROOT) ClassId for this extension
            KeyVal = RegCR.value("." + fileExtension + "/.").toString();
        }

        if (KeyVal != m_ClassId)
            RegCU.setValue(CUKeyName + "/MPlayer_Backup", KeyVal);

        //Save last ProgId and Application values from the Exts key
        KeyVal = RegCU.value(ExtKeyName + "/Progid").toString();

        if (KeyVal != m_ClassId && KeyVal != m_ClassId2)
            RegCU.setValue(ExtKeyName + "/MPlayer_Backup_ProgId", KeyVal);

        KeyVal = RegCU.value(ExtKeyName + "/Application").toString();

        if (KeyVal != m_ClassId || KeyVal != m_ClassId2)
            RegCU.setValue(ExtKeyName + "/MPlayer_Backup_Application", KeyVal);

        //Create the associations
        if (QSysInfo::WindowsVersion >= QSysInfo::WV_NT) {
            RegCU.setValue(CUKeyName + "/.", m_ClassId); 		//Extension class
            RegCU.setValue(ExtKeyName + "/Progid", m_ClassId);	//Explorer FileExt association

        } else {
            //Windows ME/98/95 support
            RegCR.setValue("." + fileExtension + "/.", m_ClassId);
        }

        if (RegCU.status() == QSettings::NoError && RegCR.status() == QSettings::NoError)
            count++;
    }