2012-03-02 189 views
7

我想知道是否有可能解决此问题。 我得到了qt应用程序,如果用户勾选复选框,我希望此应用程序在启动操作系统时启动。 香港专业教育学院已经一派,和香港专业教育学院想出了这个解决方案>在启动时运行应用程序

我的QT应用程序需要以修改注册表的管理员权限,所以

  1. 创建清单文件(<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>

2。应用此命令

公吨-manifest 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” ,但这看起来确实不切实际,我认为用户会因此感到灰心。

那么,如何解决这个问题呢?其他应用程序如何解决此问题?

+0

更好的解决方案是要求不能在应用程序的启动,但在设置“开始启动”选项root用户权限。你可不只是在按钮“开机启动”旁边创建一个提示,说这个动作需要root权限,因此UAC弹出?那么用户不会感到惊讶。当然,没有UAC的解决方案说任何事情都会更好。 – Redfox 2012-03-02 13:57:21

+0

好吧,我不知道如何获得root权限后,只需点击该复选框。顺便说一句,我目前的“解决方案”导致UAC警报窗口,我不认为它是负面的东西。作为临时的解决方案,我可能会离开默认priveleges“asInvoker”,并在该复选框下写下类似于“此操作需要管理员授权,您必须启动applicatino与”以管理员身份运行“选项” – 2012-03-02 14:16:57

+0

但仍然,即时通讯想知道其他应用正在解决这个问题。例如,我一直在浏览注册表,我发现Hamachi在那里,它确实从系统启动开始,但应用程序不需要管理员权限,那么这个注册表项是如何创建的? (可能在安装过​​程中,我猜...但仍然,如果该应用程序没有管理员权限,用户将如何通过应用程序取消它) – 2012-03-02 14:20:23

回答

1

对于大家谁正在试图解决这个问题,这是100%的工作液:

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

  1. 创建app1.exe
  2. 创建app2.exe与管理priveleges - 教程在第一篇文章(清单文件,mt.exe等)
  3. 当用户勾选app1.exe中的复选框,我调用app2.exe(例如没有参数) - 你可以找到所有的功能对于这个@链接我只是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)

这给出(在我的运7):

C:\用户\ user_name \ AppData \ Roaming \ Microsoft \ Windows \ Start Menu \ Programs

,所有我们需要的是:

C:\ Users \用户名\ AppData的\漫游\微软\的Windows \开始菜单\程序\启动

简单!

我在没有任何麻烦的UAC或任何类型的权利问题,在我的大多数应用程序中使用这个。
这可能不是最好的方法......但它肯定是一种简单的方法。
(请全情的想法/意见,如果这种做法有什么大的缺点。)

更新: 要创建快捷方式在启动文件夹中的应用程序,使用此代码:

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

我希望这有助于! :)

+1

但是如何在那里为应用程序创建实际的快捷方式? – zar 2015-06-25 19:01:49

+0

您必须使用WinAPI for – 2016-01-15 18:44:02

+0

@zadane:我已更新原始答案并回答了您的问题。 IHTH! :) – zeFree 2016-01-16 19:46:17

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('/', '\\'));

相关问题