Запустить приложение при запуске - PullRequest
8 голосов
/ 02 марта 2012

Мне интересно, если это возможно, чтобы решить эту проблему.У меня есть приложение qt, и если пользователь поставит галочку, я хочу, чтобы это приложение запускалось при запуске операционной системы.Я уже гуглил и нашел решение>

моему приложению 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");
    }
}

Итак, это выглядит хорошо, верно?НО ... приложение с привилегиями администратора по умолчанию не может быть запущено при запуске операционной системы, НО приложение без привилегий администратора не может изменять реестр.Итак, есть одно решение - сообщить пользователю, что если он хочет установить эту опцию «запуска», ему сначала нужно запустить приложение от имени администратора, затем приложение сможет изменять реестр, а права по умолчанию останутся «asInvoker»., но это кажется действительно непрактичным, и я думаю, что пользователи будут разочарованы этим.

Итак, как решить эту проблему?как другие приложения решают эту проблему?

Ответы [ 4 ]

9 голосов
/ 29 сентября 2013

Вам не понадобятся привилегии администратора, если вы используете следующий ключ:

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

Уведомление

HKEY_CURRENT_USER

вместо использования

HKEY_LOCAL_MACHINE
4 голосов
/ 16 января 2013

Мои 2 цента! :)

Почему бы просто не поместить ярлык приложения в папку «Автозагрузка».
Qt предоставляет кроссплатформенный способ определения путей ко многим системным каталогам по умолчанию, используя класс QDesktopServices.
(Источник: Спасибо Дейву Матеру за его ответ на этот вопрос .)

Метод:

QDesktopServices :: storageLocation (QDesktopServices :: ApplicationsLocation)

Это дает (на моей Win 7):

C: \ Users \ имя_пользователя \ AppData \ Roaming \ Microsoft \ Windows \ Меню Пуск \ Программы

и все, что нам нужно, это:

C: \ Users \ имя_пользователя \ AppData \ Roaming \ Microsoft \ Windows \ Меню Пуск \ Программы \ Автозагрузка

Simple!

Я использую это без каких-либо проблем с UAC или каких-либо проблем с правами в большинстве моих приложений.
Возможно, это не лучший способ ... но это, безусловно, простой способ.
(Пожалуйста, укажите в мыслях / комментариях, если у этого подхода есть большие недостатки.)

Обновление: Чтобы создать ярлык для приложения в папке автозагрузки, используйте этот код:

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

Надеюсь, это поможет! :)

3 голосов
/ 22 июля 2016

Включите этот заголовок QSettings

#include <QSettings>

И добавьте это в свой код.

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

2 голосов
/ 03 марта 2012

Для всех, кто пытается решить проблему, это 100% рабочее решение:

Как я могу попросить пользователя о повышенных разрешениях во время выполнения?

  1. create 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. проблема решена.

...