2012-03-02 67 views
7

tôi tự hỏi liệu có thể giải quyết vấn đề này hay không. Tôi có ứng dụng qt và nếu người dùng đánh dấu vào hộp kiểm, tôi muốn ứng dụng này khởi chạy khi khởi động hệ điều hành. Ive đã googled và ive đưa ra giải pháp này>Chạy ứng dụng khi khởi động

ứng dụng QT tôi cần đặc quyền quản trị để sửa đổi registry, do đó

  1. tạo file manifest (<requestedExecutionLevel level="requireAdministrator" uiAccess="false"/>)

2. áp dụng lệnh này

mt -manifest manifestfile -outputresource: binfile.exe; 1

3.sử dụng đoạn mã này trong QT để sửa đổi đăng ký

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"); 
    } 
} 

Vì vậy, điều này có vẻ đúng không? NHƯNG ... ứng dụng với quyền quản trị mặc định không thể được khởi chạy khi khởi động hệ điều hành, NHƯNG ứng dụng mà không cần quản trị viên không thể sửa đổi sổ đăng ký. Vì vậy, có một giải pháp - cho người dùng biết rằng nếu anh ta muốn đặt tùy chọn "khởi động" này, trước tiên anh ta cần bắt đầu ứng dụng là quản trị viên, sau đó ứng dụng sẽ có thể sửa đổi đăng ký và các đặc quyền mặc định sẽ vẫn là "asInvoker" , nhưng điều này có vẻ thực tế và tôi nghĩ rằng người dùng sẽ không được khuyến khích bởi điều này.

Vì vậy, cách giải quyết vấn đề này? cách các ứng dụng khác giải quyết vấn đề này?

+0

Một giải pháp tốt hơn là yêu cầu quyền root chứ không phải khi khởi động ứng dụng mà là cài đặt tùy chọn "bắt đầu khởi động". Bạn có thể không chỉ tạo một mẹo bên cạnh nút "khởi động khi khởi động" cho biết hành động này yêu cầu quyền root và do đó UAC sẽ bật lên? Người dùng sẽ không ngạc nhiên khi đó. Althoug một giải pháp mà không có UAC nói bất cứ điều gì sẽ tốt hơn, tất nhiên. – Redfox

+0

tốt, tôi không biết cách lấy đặc quyền root chỉ sau khi nhấp vào hộp kiểm đó. Bằng cách này, "giải pháp" hiện tại của tôi đang gây ra cửa sổ cảnh báo UAC lên và tôi không coi nó là một cái gì đó tiêu cực. Là giải pháp tạm thời, tôi có thể sẽ để mặc định các private priveleges "asInvoker" và viết dưới hộp kiểm đó như "hành động này yêu cầu quản trị viên, bạn phải khởi chạy applicatino với tùy chọn" chạy như quản trị viên "" –

+0

Nhưng vẫn còn, tôi tự hỏi làm thế nào khác ứng dụng đang giải quyết vấn đề này.Ví dụ, ive được duyệt registry, và tôi thấy rằng Hamachi đã có, và nó thực sự bắt đầu khởi động hệ thống, nhưng ứng dụng không yêu cầu quản trị viên, vì vậy làm thế nào là mục đăng ký này được thực hiện? (có lẽ trong khi instalation, tôi đoán .., nhưng vẫn còn, làm thế nào người dùng sẽ hủy bỏ nó thông qua ứng dụng nếu ứng dụng đó không có priveleges admin) –

Trả lời

1

Đối với tất cả mọi người đang cố gắng để giải quyết vấn đề, đây là giải pháp làm việc 100%:

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

  1. tạo app1.exe
  2. tạo app2.exe với đặc quyền quản trị - hướng dẫn là trong bài đăng đầu tiên (tệp kê khai, mt.exe, v.v ..)
  3. khi người dùng đánh dấu vào hộp kiểm trong app1.exe, tôi gọi app2.exe (ví dụ không có đối số) - bạn có thể tìm thấy tất cả chức năng cho @ này liên kết ive chỉ p osted trên // tốt, trên thực tế, bạn không cần phải sử dụng chức năng từ ví dụ trên: tôi thấy cuộc gọi này tốt hơn nhiều

       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, ví dụ

    QApplication a(argc, argv); 
        MainWindow w; 
    // w.show(); 
    if (argc == 1) { 
    w.test(); 
    a.quit(); 
    
    } 
    
  5. giải quyết được sự cố.

2

2 xu của tôi! :)

Tại sao không chỉ cần đặt lối tắt ứng dụng trong thư mục "Khởi động".
Qt cung cấp một cách đa nền tảng để xác định đường dẫn đến nhiều thư mục hệ thống mặc định bằng cách sử dụng lớp QDesktopServices.
(Nguồn: Cảm ơn Dave Mateer cho số answer của mình để question này.)

Phương pháp này là:

QDesktopServices :: storageLocation (QDesktopServices :: ApplicationsLocation)

Điều này cho phép (trên Win của tôi 7):

C: \ Users \ user_name \ AppData \ Roaming \ Microsoft \ Windows \ Start Menu \ Programs

và tất cả chúng ta cần là:

C: \ Users \ user_name \ AppData \ Roaming \ Microsoft \ Windows \ Start Menu \ Programs \ Startup

đơn giản!

Tôi sử dụng tính năng này mà không gặp bất kỳ sự cố nào về UAC hoặc bất kỳ vấn đề quyền nào trong hầu hết các ứng dụng của tôi.
Đây có thể không phải là cách tốt nhất ... nhưng nó chắc chắn là một cách dễ dàng.
(Xin sân trong suy nghĩ/ý kiến ​​nếu phương pháp này có bất cứ nhược điểm lớn.)

Cập nhật: Để tạo short-cut cho các ứng dụng trong thư mục startup, sử dụng mã này:

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

Tôi hy vọng điều này sẽ giúp bạn! :)

+1

Nhưng cách tạo lối tắt thực sự cho ứng dụng ở đó? – zar

+0

Bạn sẽ phải sử dụng WinAPI cho số –

+0

@zadane đó: Tôi đã cập nhật câu trả lời gốc với câu trả lời cho câu hỏi của bạn. IHTH! :) – zeFree

7

Bạn sẽ không cần admiministrator đặc quyền nếu bạn sử dụng khóa sau:

QSettings settings("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat); 

Thông báo

HKEY_CURRENT_USER 

thay vì sử dụng

HKEY_LOCAL_MACHINE 
0

Bao gồm tiêu đề này QSettings

#include <QSettings>

Và thêm mã này vào mã của bạn.

QSettings settings("HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run", QSettings::NativeFormat); settings.setValue("YourApplicationName", QCoreApplication::applicationFilePath().replace('/', '\\'));

Các vấn đề liên quan