Ant*_*tli 8 registry qt uac startup
我想知道它是否有可能解决这个问题.我有qt应用程序,如果用户勾选复选框,我希望此应用程序在启动操作系统时启动.我已经google了,我想出了这个解决方案>
我的QT应用程序需要管理员权限才能修改注册表,所以
<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" ,但这似乎真的不切实际,我认为用户会因此而气馁.
那么,如何解决这个问题呢?其他应用如何解决这个问题?
如果使用以下密钥,则不需要管理员权限:
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)
我的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)
我希望这有帮助!:)
对于每个试图解决问题的人来说,这是 100% 有效的解决方案:
当用户勾选 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)例如app2.exe
QApplication a(argc, argv);
MainWindow w;
// w.show();
if (argc == 1) {
w.test();
a.quit();
}
Run Code Online (Sandbox Code Playgroud)问题解决了。
归档时间: |
|
查看次数: |
8368 次 |
最近记录: |