2012-03-02 230 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('/', '\\'));

相關問題