public async Task <bool> ProcessPipeServer(NostaleProcess process, string sessionToken) { var pipeServer = new NostalePipeServer(process, sessionToken); await pipeServer.Start(); return(pipeServer.Successful); }
public NostalePipeServer(NostaleProcess process, string sessionToken) { _sessionToken = sessionToken; Process = process; _cancellationTokenSource = new CancellationTokenSource(); Process.Process.EnableRaisingEvents = true; Process.Process.Exited += OnNostaleExit; }
public async Task <NostaleProcess> Launch(GameforgeAccount account, string nostalePath) { NostaleProcess process = await Launcher.Launch(account, await Api.GetSessionToken(account, true), nostalePath); if (process != null) { ActiveProcesses.Add(process); } return(process); }
public Task <NostaleProcess> Launch(GameforgeAccount account, string sessionToken, string nostalePath) { return(Task.Run(() => { lock (_lock) { NostaleProcess process = RunProcess(account, nostalePath); process.Initialized = ProcessPipeServer(process, sessionToken).GetAwaiter().GetResult(); if (process.Initialized) { while (true) { List <IntPtr> handles = new List <IntPtr>(); // wait for main window open User32.EnumDesktopWindows(IntPtr.Zero, (hWnd, lParam) => { User32.GetWindowThreadProcessId(hWnd, out uint processId); if (processId == process.ProcessId) { handles.Add(hWnd); } return true; }, IntPtr.Zero); if (handles.Count > 6 || process.HasExited) { break; } Task.Delay(50).GetAwaiter().GetResult(); } } return process; } })); }