2014-04-28 18 views
12

Tôi có một exe cập nhật có nghĩa là đóng exe chính, thay thế nó bằng một exe đã cập nhật, và sau đó khởi chạy exe đã cập nhật đó. Khi trình cập nhật cố gắng khởi động bản cập nhật đã được cập nhật, nếu hộp thoại quyền UAC bị người dùng từ chối, trình cập nhật sẽ bị treo. Điều này là do hàm Process.Start() không bao giờ trả về. Đồng hồ đo chu kỳ CPU của tôi cho thấy thực tế không sử dụng btw.Process.Start không bao giờ trả về khi UAC từ chối

Tôi hy vọng tất cả người dùng của tôi chỉ nói "có" với UAC, nhưng vì tôi ở đây tôi muốn xử lý trường hợp này với một số loại thông báo lỗi ít nhất. Giả sử người dùng của tôi sẽ có ít nhất Windows 7. Bản thân exes là các ứng dụng Winforms 32 bit. Nhắm mục tiêu .Net Framework là 4.0. Sử dụng Visual Studio 2010 Ultimate.

Bất kỳ ý tưởng nào về cách phát hiện khi người dùng của tôi từ chối hộp thoại UAC?

Tôi đoán tất cả những gì tôi có thể làm là làm cho Process.Start() chạy trên một chuỗi riêng biệt sẽ hết thời gian chờ sau một thời gian. Đối với mã hơn:

private void RestartProcess() 
{ 
    ProcessStartInfo startInfo = new ProcessStartInfo(); 
    startInfo.FileName = @"C:\Users\Me\Documents\Visual Studio 2010\Projects\updated.exe"; 
    MessageBox.Show("Attempting to start process"); 
    Process newProc = Process.Start(startInfo); 
    MessageBox.Show("If this shows, the user has clicked YES in the UAC."); 
} 

Giải pháp:

Process.Start() thoát âm thầm với một Win32Exception trừ khi có ai sử dụng một khối try {} catch {} để bắt lỗi.

+1

Vui lòng nhập mã. –

+0

Tôi giả sử (dựa trên những gì bạn đã nêu ở trên) mà bạn biết khi nào người dùng nhấp vào "Có" trên hộp thoại UAC, phải không? Nếu bạn biết điều này, tại sao không sử dụng [DialogResult Property] (http://msdn.microsoft.com/en-us/library/system.windows.forms.form.dialogresult (v = vs.110) .aspx) để xử lý trường hợp "Không"? – Brandon

+0

Bạn đã thử dò tìm [Manifest] (http://msdn.microsoft.com/en-us/library/bb756929.aspx) chưa? Thậm chí không cung cấp cho người dùng cơ hội để nói số – tyh

Trả lời

7
Process newProc = Process.Start(startInfo); 
    MessageBox.Show("If this shows, the user has clicked YES in the UAC."); 

Điều này là bình thường, ngoại lệ được nâng lên bởi Process.Start() sẽ bỏ qua cuộc gọi MessageBox.Show(). Nó là một Win32Exception cho mã lỗi Windows 1223, ERROR_CANCELLED, "Các hoạt động đã bị hủy bỏ bởi người sử dụng".

Rõ ràng bạn sẽ muốn tránh ngoại lệ nuốt tại đây.

+0

Hoàn hảo. Tất cả những gì được yêu cầu là một câu lệnh try try đơn giản. Lời cảm ơn của tôi, ông Passant. –

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