启动时运行应用程序

问题描述 投票:0回答:5

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

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

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

2.应用此命令

mt -manifest 清单文件 -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");
    }
}

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

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

qt registry uac startup
5个回答
10
投票

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

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

通知

HKEY_CURRENT_USER

而不是使用

HKEY_LOCAL_MACHINE

7
投票

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

方法是:

QDesktopServices::storageLocation(QDesktopServices::ApplicationsLocation)

这给出(在 Windows 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");

3
投票

包含此标题 QSettings

#include <QSettings>

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

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


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);
    
  4. app2.exe,例如

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


0
投票

使用此链接 创建 stratup 应用程序和代码:

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.