启动时运行应用程序

时间:2012-03-02 13:52:03

标签: qt registry uac startup

我想知道它是否有可能解决这个问题。 我有qt应用程序,如果用户勾选复选框,我希望此应用程序在启动操作系统时启动。 我已经用Google搜索了,我想出了这个解决方案>

我的QT应用程序需要管理员权限才能修改注册表,所以

  1. 创建清单文件(<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
  2. 2.应用此命令

    mt -manifest manifestfile -outputresource:binfile.exe; 1

    3.在QT中使用此段代码修改注册表

    void MainWindow::set_on_startup() {
    
    QSettings settings("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat);
    
           if (ui->checkBox->checkState()) {
            QString value = QCoreApplication::applicationFilePath(); //get absolute path of running exe
            QString apostroph = "\"";
    
            #ifdef DEBUG
            ui->textEdit->append(QCoreApplication::applicationFilePath ());
    #endif
    
           value.replace("/","\\");
           value = apostroph + value + apostroph + " --argument";
    
    #ifdef DEBUG
           ui->textEdit->append(value);
    #endif
            //write value to the register
            settings.setValue("name", value);
    
    
        }
        else {
             settings.remove("name");
        }
    }
    

    那么,这看起来不错吧? 但是......默认管理员priveleges的应用程序无法在启动操作系统时启动,但是没有管理员priveleges的应用程序无法修改注册表。所以,有一个解决方案 - 告诉用户,如果他想设置这个“启动”选项,他首先需要以管理员身份启动应用程序,然后应用程序将能够修改注册表,默认权限将保持“asInvoker” ,但这似乎真的不切实际,我认为用户会因此而气馁。

    那么,如何解决这个问题呢?其他应用程序如何解决这个问题?

5 个答案:

答案 0 :(得分:9)

如果您使用以下密钥,则不需要管理员权限:

   QSettings settings("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat);

注意

HKEY_CURRENT_USER

而不是使用

HKEY_LOCAL_MACHINE

答案 1 :(得分:4)

我的2美分! :)

为什么不简单地将应用程序快捷方式放在“Startup”文件夹中 Qt提供了一种使用QDesktopServices类确定许多默认系统目录路径的跨平台方法 (来源:感谢Dave Mateer了解answer question

方法是:

  

QDesktopServices :: storageLocation(QDesktopServices :: ApplicationsLocation)

这给出了(在我的Win 7上):

  

C:\ Users \ user_name \ AppData \ Roaming \ Microsoft \ Windows \ Start Menu \ Programs

我们所需要的只是:

  

C:\ Users \ user_name \ AppData \ Roaming \ Microsoft \ Windows \ Start Menu \ Programs \ Startup

简单!

我在大多数应用中都没有使用UAC或任何类型的权利问题 这可能不是最好的方式......但这当然是一种简单的方法 (如果这种方法有任何重大缺点,请提出意见/评论。)

<强>更新 要在启动文件夹中为应用程序创建快捷方式,请使用以下代码:

QFileInfo fileInfo(QCoreApplication::applicationFilePath());
QFile::link(QCoreApplication::applicationFilePath(), QDesktopServices::storageLocation(QDesktopServices::ApplicationsLocation) + QDir::separator() + "Startup" + QDir::separator() + fileInfo.completeBaseName() + ".lnk");

我希望这有帮助! :)

答案 2 :(得分:2)

对于每个试图解决问题的人来说,这是100%可行的解决方案:

How can I ask the user for elevated permissions at runtime?

  1. 创建app1.exe
  2. 使用admin priveleges创建app2.exe - 教程位于第一篇文章(清单文件,mt.exe等)。
  3. 当用户勾选app1.exe中的复选框时,我调用app2.exe(例如没有参数) - 你可以找到所有这个函数@我上面刚刚发布的链接 //嗯,事实上,你不必使用上面例子中的函数: 我觉得这个电话好多了

                  QObject *parent = new QObject();
                  QString program = AppToExec; //"/path/to/the/app2.exe"
                  QStringList arguments ;
                  arguments << ""; //just in case we want arguments
                  QProcess *myProcess = new QProcess(parent);
                  myProcess->start(program);
    
  4. app2.exe,例如

      QApplication a(argc, argv);
      MainWindow w;
    //  w.show();
     if (argc == 1) {
     w.test();
     a.quit();
    
    }
    
  5. 问题解决了。

答案 3 :(得分:2)

包含此标题QSettings

#include <QSettings>

并将其添加到您的代码中。

QSettings settings("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat); settings.setValue("YourApplicationName", QCoreApplication::applicationFilePath().replace('/', '\\'));

答案 4 :(得分:0)

使用这个 link 创建分层应用和代码:

void make_startup_app(){
    QString appName = "app.exe";
    QString appNameLink = appName+".lnk";
    QFile::link(appName, appNameLink);

    QString userName = QDir::home().dirName();

    QString dir_startup = "C:/Users/" + userName +
            "/AppData/Roaming/Microsoft/Windows/Start Menu/Programs/Startup/"+ appNameLink;
    QFile::copy(appNameLink, dir_startup);
}