Подтвердить что ты не робот

Process.Start никогда не возвращается, когда UAC отрицает

У меня есть программа updater exe, которая предназначена для закрытия первичного exe, заменяет его обновленным exe, а затем запускает этот обновленный exe. Когда программа обновления пытается запустить обновленный exe, если пользовательский диалог UAC запретит пользователю, программа обновления будет зависать. Это связано с тем, что функция Process.Start() никогда не возвращается. Мой счетчик циклов процессора практически не использует btw.

Я бы надеялся, что все мои пользователи просто скажут "да" UAC, но поскольку я здесь, я бы хотел обработать этот случай с каким-то сообщением об ошибке. Предположим, что у моих пользователей будет по крайней мере Windows 7. Обычно exes - это 32-битные Winforms-приложения. Целевая .Net Framework 4.0. Использование Visual Studio 2010 Ultimate.

Любые идеи о том, как обнаружить, когда мой пользователь отклоняет диалог UAC? ​​

Я предполагаю, что все, что я могу сделать, - это запустить Process.Start() в отдельном потоке, который через некоторое время перейдет в режим ожидания. Для получения дополнительного кода:

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

Решение:

Process.Start() автоматически выходит из Win32Exception, если вы не используете блок Try {} Catch {}, чтобы поймать ошибку.

4b9b3361

Ответ 1

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

Это нормально, исключение, вызванное Process.Start(), обходит вызов MessageBox.Show(). Это код ошибки Win32Exception для Windows 1223, ERROR_CANCELLED, "Операция была отменена пользователем".

Ясно, что вы не захотите проглатывать исключения здесь.