Reputation: 936
i am wondering if its possible to solve this problem. Ive got qt application and if user tick the checkbox, i want this application to launch on startup of operating system. Ive already googled, and ive come up with this solution>
my QT application needs admin privileges in order to modify registry, so
<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>
)2.apply this command
mt -manifest manifestfile -outputresource:binfile.exe;1
3.use this piece of code in QT to modify registry
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");
}
}
So, this looks good right ? BUT... application with default admin priveleges cant be launched on startup of operating system, BUT application without admin priveleges cant modify registry. So , there is one solution - tell a user, that if he wants to set this "startup" option, he first needs to start application as admin, then the application will be able to modify registry, and default privileges will remain "asInvoker", but this seems really impractical and i think that users will be discouraged by this.
So, how to solve this problem ? how other applications solve this problem ?
Upvotes: 9
Views: 11238
Reputation: 2158
Why not simply put the app shortcut in "Startup" folder.
Qt provides a cross-platform way of determining the paths to many default system directories using the QDesktopServices class.
(Source: Thanks to Dave Mateer for his answer to this question.)
The method is:
QDesktopServices::storageLocation(QDesktopServices::ApplicationsLocation)
This gives (on Windows 7):
C:\Users\user_name\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
and all it needs is:
C:\Users\user_name\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
It works without any hassle of UAC or any kind of problem with rights.
Update: To create the short-cut for the application in startup folder, use this code:
QFileInfo fileInfo(QCoreApplication::applicationFilePath());
QFile::link(QCoreApplication::applicationFilePath(), QDesktopServices::storageLocation(QDesktopServices::ApplicationsLocation) + QDir::separator() + "Startup" + QDir::separator() + fileInfo.completeBaseName() + ".lnk");
Upvotes: 7
Reputation: 467
Using this link create stratup app and code:
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);
}
Upvotes: 0
Reputation: 31
Include this header QSettings
#include <QSettings>
And add this into your code.
QSettings settings("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run",
QSettings::NativeFormat);
settings.setValue("YourApplicationName",
QCoreApplication::applicationFilePath().replace('/', '\\'));
Upvotes: 3
Reputation: 9455
You won't need admiministrator privileges if you use following key:
QSettings settings("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat);
Notice
HKEY_CURRENT_USER
instead of using
HKEY_LOCAL_MACHINE
Upvotes: 10
Reputation: 936
For everybody who are trying to solve the problem, this is the 100% working solution:
How can I ask the user for elevated permissions at runtime?
when user tick the checkbox in app1.exe, i call the the app2.exe (for example with no arguments) - you can find all function for this @ the link ive just posted above // well, in fact, you dont have to use the function from the example above: i find this call much better
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);
app2.exe, for example
QApplication a(argc, argv);
MainWindow w;
// w.show();
if (argc == 1) {
w.test();
a.quit();
}
problem solved.
Upvotes: 2