2012-03-02 6 views
7

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

мое приложение QT нужно привилегии администратора для того, чтобы изменить реестр, так

  1. создать файл манифеста (<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>)

2. применить эту команду

мт -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"); 
    } 
} 

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

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

+0

Лучшим решением было бы запросить права суперпользователя не при запуске приложения, но на установке опции «запуск при загрузке». Не могли бы вы просто создать подсказку рядом с кнопкой «запуск при загрузке», заявив, что для этого действия требуются права root и, следовательно, UAC появится? Тогда пользователь не удивился бы. Althoug решение без UAC говорит, что все будет лучше, конечно. – Redfox

+0

ну, я не знаю, как получить привилегии root только после нажатия на этот флажок. Кстати, мое текущее «решение» вызывает окно предупреждения UAC, и я не считаю его чем-то негативным. Как временное решение, я просто, вероятно, останусь в привилегированных привилегиях «asInvoker» и напишу под этим флажком что-то вроде «для этого действия требуются административные привилегии, вы должны запустить applicationatino с опцией« run as administrator »» –

+0

Но все же, им интересно, как другие приложение решает эту проблему.Например, я просматривал реестр, и я обнаружил, что Hamachi был там, и он действительно начинается при запуске системы, но приложение не требует административных привилегий, так как это было сделано в записи реестра? (возможно, во время установки, я думаю .., но все равно, как пользователь отменит его через приложение, если у этого приложения нет админ-привилегий) –

ответ

1

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

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

  1. создать app1.exe
  2. создать app2.exe с администратора специальными разрешениями - учебник в первом сообщении (файл манифеста, mt.exe и т. д.)
  3. , когда пользователь установил флажок в app1.exe, я вызываю app2.exe (например, без аргументов) - вы можете найти все функции для этого @ ссылка ive просто p Osted выше // ну, на самом деле, вы не должны использовать функцию из примера выше: я найти этот вызов намного лучше

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

2

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

Почему бы просто не просто добавить ярлык приложения в папку «Запуск».
Qt обеспечивает кросс-платформенный способ определения путей для многих системных каталогов по умолчанию с использованием класса QDesktopServices.
(Источник: Благодаря Dave Mateer для его answer к этому question.)

Метод:

QDesktopServices :: storageLocation (QDesktopServices :: ApplicationsLocation)

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

C: \ Users \ user_name \ AppData \ Роуминг \ Microsoft \ Windows \ Меню Пуска \ Программы

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

C: \ Users \ имя_пользователя \ AppData \ Roaming \ Microsoft \ Windows \ Start Menu \ Programs \ Startup

просто!

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

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

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

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

+1

Но как создать там ярлык для приложения? – zar

+0

Вам нужно будет использовать WinAPI для этого –

+0

@zadane: я обновил исходный ответ с ответом на ваш вопрос. IHTH! :) – zeFree

7

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

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

Уведомление

HKEY_CURRENT_USER 

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

HKEY_LOCAL_MACHINE 
0

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

#include <QSettings>

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

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

Смежные вопросы