feat: PC 端运行时要求以管理员身份重启 MAA (#15748)

This commit is contained in:
SherkeyXD
2026-02-28 20:15:22 +08:00
committed by GitHub
parent 2f442a441e
commit 82fc8a384e
8 changed files with 78 additions and 1 deletions

View File

@@ -2475,6 +2475,25 @@ public class AsstProxy
/// <returns>是否成功。</returns>
private bool AsstAttachWindowConnect(ref string error)
{
if (!Bootstrapper.IsUserAdministrator())
{
var result = Application.Current.Dispatcher.Invoke(() =>
MessageBoxHelper.Show(
LocalizationHelper.GetString("AttachWindowNeedAdmin"),
"MAA",
MessageBoxButton.YesNo,
MessageBoxImage.Question));
if (result == MessageBoxResult.No)
{
error = LocalizationHelper.GetString("RestartAsAdminFailed");
return false;
}
Bootstrapper.RestartAsAdmin();
return false;
}
Instances.TaskQueueViewModel.AddLog(LocalizationHelper.GetString("UseAttachWindowWarning"), UiLogColor.Warning);
const string TargetWindowName = "明日方舟";

View File

@@ -668,6 +668,12 @@ public class Bootstrapper : Bootstrapper<RootViewModel>
}
}
if (_restartStartInfo is not null)
{
Process.Start(_restartStartInfo);
return;
}
if (!_isRestartingWithoutArgs)
{
return;
@@ -706,6 +712,7 @@ public class Bootstrapper : Bootstrapper<RootViewModel>
}
private static bool _isRestartingWithoutArgs;
private static ProcessStartInfo _restartStartInfo;
/// <summary>
/// 重启,不带参数
@@ -718,6 +725,18 @@ public class Bootstrapper : Bootstrapper<RootViewModel>
Execute.OnUIThread(Application.Current.Shutdown);
}
/// <summary>
/// 重启,使用自定义启动参数
/// </summary>
/// <param name="startInfo">新进程的启动参数。</param>
/// <param name="caller">Caller Member Name</param>
public static void ShutdownAndRestartWith(ProcessStartInfo startInfo, [CallerMemberName] string caller = "")
{
_restartStartInfo = startInfo;
_logger.Information("Shutdown and restart with custom StartInfo, call by `{Caller}`", caller);
Execute.OnUIThread(Application.Current.Shutdown);
}
private static bool _isRestartingAfterUpdate;
public static void RestartAfterUpdate([CallerMemberName] string caller = "")
@@ -732,6 +751,24 @@ public class Bootstrapper : Bootstrapper<RootViewModel>
Execute.OnUIThread(Application.Current.Shutdown);
}
/// <summary>
/// 以管理员权限重启应用UAC 弹窗在退出时触发。
/// </summary>
public static void RestartAsAdmin()
{
if (Environment.ProcessPath is null)
{
return;
}
ShutdownAndRestartWith(new ProcessStartInfo
{
FileName = Environment.ProcessPath,
UseShellExecute = true,
Verb = "runas",
});
}
private static bool _isWaitingToRestart;
public static async Task RestartAfterIdleAsync()

View File

@@ -1243,6 +1243,10 @@ Right-click to clear inactive jobs</system:String>
<system:String x:Key="AttachWindowNotFound">Window "{0}" not found, please ensure the game is running</system:String>
<system:String x:Key="AttachWindowMultipleFound">Found {0} "{1}" windows, using the first one</system:String>
<system:String x:Key="AttachWindowFound">Found window "{0}"</system:String>
<system:String x:Key="Administrator">Admin</system:String>
<system:String x:Key="AttachWindowNeedAdmin">PC connection requires administrator privileges.\nRestart MAA as administrator?</system:String>
<system:String x:Key="RestartingAsAdmin">Restarting as administrator…</system:String>
<system:String x:Key="RestartAsAdminFailed">Please run MAA as administrator manually.</system:String>
<system:String x:Key="AttachWindowFailed">AttachWindow failed, please check screencap/input method settings</system:String>
<system:String x:Key="UseAttachWindowTip">Use Win32 window binding for Arknights PC client instead of ADB connection for emulators or phones</system:String>
<system:String x:Key="UseAttachWindowWarning" xml:space="preserve">PC connection (experimental feature, stability not guaranteed)

View File

@@ -1244,6 +1244,10 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="AttachWindowNotFound">ウィンドウ "{0}" が見つかりません。ゲームが起動していることを確認してください</system:String>
<system:String x:Key="AttachWindowMultipleFound">{0} 個の "{1}" ウィンドウが見つかりました。最初のものを使用します</system:String>
<system:String x:Key="AttachWindowFound">ウィンドウ "{0}" が見つかりました</system:String>
<system:String x:Key="Administrator">管理者</system:String>
<system:String x:Key="AttachWindowNeedAdmin">PC 接続には管理者権限が必要です。\n管理者として MAA を再起動しますか?</system:String>
<system:String x:Key="RestartingAsAdmin">管理者として再起動しています…</system:String>
<system:String x:Key="RestartAsAdminFailed">手動で管理者として MAA を実行してください。</system:String>
<system:String x:Key="AttachWindowFailed">AttachWindow の接続に失敗しました。スクリーンキャプチャ/入力方法の設定を確認してください</system:String>
<system:String x:Key="UseAttachWindowTip">エミュレータや携帯電話への ADB 接続ではなく、アークナイツ PC クライアントに Win32 ウィンドウバインディングを使用します</system:String>
<system:String x:Key="UseAttachWindowWarning" xml:space="preserve">PC 接続(実験的機能・動作の安定性は保証されません)

View File

@@ -1245,6 +1245,10 @@ C:\\leidian\\LDPlayer9
<system:String x:Key="AttachWindowNotFound">창 "{0}"을(를) 찾을 수 없습니다. 게임이 실행 중인지 확인하세요</system:String>
<system:String x:Key="AttachWindowMultipleFound">{0}개의 "{1}" 창을 찾았습니다. 첫 번째 창을 사용합니다</system:String>
<system:String x:Key="AttachWindowFound">창 "{0}"을(를) 찾았습니다</system:String>
<system:String x:Key="Administrator">관리자</system:String>
<system:String x:Key="AttachWindowNeedAdmin">PC 연결에는 관리자 권한이 필요합니다.\n관리자로 MAA를 다시 시작하시겠습니까?</system:String>
<system:String x:Key="RestartingAsAdmin">관리자로 다시 시작하는 중…</system:String>
<system:String x:Key="RestartAsAdminFailed">MAA를 관리자 권한으로 직접 실행해 주세요.</system:String>
<system:String x:Key="AttachWindowFailed">AttachWindow 연결에 실패했습니다. 스크린샷/입력 방법 설정을 확인하세요</system:String>
<system:String x:Key="UseAttachWindowTip">에뮬레이터나 휴대폰용 ADB 연결 대신 명일방주 PC 클라이언트에 Win32 창 바인딩을 사용합니다</system:String>
<system:String x:Key="UseAttachWindowWarning" xml:space="preserve">PC 연결 (실험적 기능이며 안정성은 보장되지 않습니다)

View File

@@ -1244,6 +1244,10 @@ C:\\leidian\\LDPlayer9。\n
<system:String x:Key="AttachWindowNotFound">未找到窗口 "{0}",请确保游戏已启动</system:String>
<system:String x:Key="AttachWindowMultipleFound">找到 {0} 个 "{1}" 窗口,将使用第一个</system:String>
<system:String x:Key="AttachWindowFound">找到窗口 "{0}"</system:String>
<system:String x:Key="Administrator">管理员</system:String>
<system:String x:Key="AttachWindowNeedAdmin">PC 端连接需要管理员权限。\n是否以管理员身份重启 MAA</system:String>
<system:String x:Key="RestartingAsAdmin">正在以管理员身份重启…</system:String>
<system:String x:Key="RestartAsAdminFailed">请手动以管理员身份运行 MAA</system:String>
<system:String x:Key="AttachWindowFailed">AttachWindow 绑定窗口失败,请检查截图/输入方式配置</system:String>
<system:String x:Key="UseAttachWindowTip">使用 Win32 窗口绑定明日方舟 PC 端,而非 ADB 连接模拟器或手机</system:String>
<system:String x:Key="UseAttachWindowWarning" xml:space="preserve">连接 PC 端(实验性功能,稳定性无法保证)

View File

@@ -1244,6 +1244,10 @@ C:\\leidian\\LDPlayer9\n
<system:String x:Key="AttachWindowNotFound">未找到視窗 "{0}",請確保遊戲已啟動</system:String>
<system:String x:Key="AttachWindowMultipleFound">找到 {0} 個 "{1}" 視窗,將使用第一個</system:String>
<system:String x:Key="AttachWindowFound">找到視窗 "{0}"</system:String>
<system:String x:Key="Administrator">管理員</system:String>
<system:String x:Key="AttachWindowNeedAdmin">PC 端連接需要管理員權限。\n是否以管理員身分重啟 MAA</system:String>
<system:String x:Key="RestartingAsAdmin">正在以管理員身分重啟…</system:String>
<system:String x:Key="RestartAsAdminFailed">請手動以管理員身分執行 MAA</system:String>
<system:String x:Key="AttachWindowFailed">AttachWindow 綁定視窗失敗,請檢查截圖/輸入方式配置</system:String>
<system:String x:Key="UseAttachWindowTip">使用 Win32 視窗綁定明日方舟 PC 端,而非 ADB 連接模擬器或手機</system:String>
<system:String x:Key="UseAttachWindowWarning" xml:space="preserve">連接 PC 端(實驗性功能,穩定性無法保證)

View File

@@ -938,7 +938,8 @@ public class SettingsViewModel : Screen
? $" - {LocalizationHelper.FormatVersion(VersionUpdateSettings.ResourceVersion, VersionUpdateSettings.ResourceDateTime)}"
: string.Empty;
string uiVersionDisplay = LocalizationHelper.FormatVersion(uiVersion, VersionUpdateSettingsUserControlModel.BuildDateTime);
rvm.WindowTitle = $"{prefix}MAA{currentConfiguration} - {uiVersionDisplay}{resourceVersionDisplay}{connectConfigName}{connectAddress}{clientName}";
string adminTag = Bootstrapper.IsAdministratorWithUac() ? $" ({LocalizationHelper.GetString("Administrator")})" : string.Empty;
rvm.WindowTitle = $"{prefix}MAA{adminTag}{currentConfiguration} - {uiVersionDisplay}{resourceVersionDisplay}{connectConfigName}{connectAddress}{clientName}";
}
/// <summary>