Example #1
0
        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;
        }
Example #3
0
        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);
        }
Example #4
0
        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;
                }
            }));
        }