启动时运行应用程序

Ant*_*tli 8 registry qt uac startup

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

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

  1. 创建清单文件(<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>)

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

adn*_*ili 9

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

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

注意

HKEY_CURRENT_USER
Run Code Online (Sandbox Code Playgroud)

而不是使用

HKEY_LOCAL_MACHINE
Run Code Online (Sandbox Code Playgroud)


zeF*_*ree 5

我的2美分!:)

为什么不简单地将应用程序快捷方式放在“启动”文件夹中。
Qt使用QDesktopServices类提供了一种跨平台的方法来确定许多默认系统目录的路径。
(图片来源:感谢戴夫狄考文,他的回答这个问题。)

方法是:

QDesktopServices :: storageLocation(QDesktopServices :: ApplicationsLocation)

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

C:\ Users \用户名\ AppData \ Roaming \ Microsoft \ Windows \开始菜单\程序

我们需要的是:

C:\ Users \用户名\ AppData \ Roaming \ Microsoft \ Windows \开始菜单\程序\启动

简单!

在大多数应用程序中,我使用它时不会遇到UAC的麻烦或任何类型的权限问题。
这可能不是最好的方法,但是肯定是一种简单的方法。
(如果这种方法有很大的缺点,请提出想法/评论。)

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

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

我希望这有帮助!:)


Ant*_*tli 2

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

如何在运行时向用户请求提升权限?

  1. 创建app1.exe
  2. 使用管理员权限创建 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);
    
    Run Code Online (Sandbox Code Playgroud)
  4. 例如app2.exe

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