我想知道是否可以解决这个问题。 我有 qt 应用程序,如果用户勾选复选框,我希望该应用程序在操作系统启动时启动。 我已经用谷歌搜索了,我想出了这个解决方案>
我的 QT 应用程序需要管理员权限才能修改注册表,所以
<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” ,但这似乎真的不切实际,我认为用户会因此而灰心。
那么,如何解决这个问题呢?其他应用程序如何解决这个问题?
如果您使用以下密钥,您将不需要管理员权限:
QSettings settings("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat);
通知
HKEY_CURRENT_USER
而不是使用
HKEY_LOCAL_MACHINE
为什么不简单地将应用程序快捷方式放在“启动”文件夹中。
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");
包含此标题 QSettings
#include <QSettings>
并将其添加到您的代码中。
QSettings settings("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run",
QSettings::NativeFormat);
settings.setValue("YourApplicationName",
QCoreApplication::applicationFilePath().replace('/', '\\'));
对于每个试图解决问题的人来说,这是 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);
app2.exe,例如
QApplication a(argc, argv);
MainWindow w;
// w.show();
if (argc == 1) {
w.test();
a.quit();
}
问题解决了。
使用此链接 创建 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);
}