FlatRedBall.Glue.ProcessManager.Tick C# (CSharp) Method

Tick() private static method

private static Tick ( object data ) : void
data object
return void
        private static void Tick(object data)
        {
            lock (ProcessLock)
            {
                var removeProcess = new List<Process>();


                foreach (var key in Processes.Keys)
                {

                    try
                    {
                        var process = key;
                        var startTime = Processes[key].StartTime;
                        var handle = Processes[key].ParentWindowHandle;

                        try
                        {
                            if (SetParent(key.MainWindowHandle, handle) == (IntPtr)0)
                            {
                                if ((DateTime.Now - startTime).TotalSeconds <= 10)
                                {
                                    continue;
                                }

                                removeProcess.Add(process);
                                continue;
                            }
                        }
                        catch
                        {
                            // The app may have already exited.  This also
                            // fails in Notepad++ for some reason.
                            removeProcess.Add(process);
                            continue;
                        }

                        removeProcess.Add(process);

                        key.EnableRaisingEvents = true;

                        var newItem = new ToolStripMenuItem(key.MainWindowTitle);
                        var focusItem = new ToolStripMenuItem("Focus");
                        var restoreItem = new ToolStripMenuItem("Restore");
                        var minimizeItem = new ToolStripMenuItem("Minimize");
                        var maximizeItem = new ToolStripMenuItem("Maximize");
                        //var grabItem = new ToolStripMenuItem("Grab Window");
                        var releaseItem = new ToolStripMenuItem("Release");
                        var resetPositionItem = new ToolStripMenuItem("Reset Position");
                        var closeItem = new ToolStripMenuItem("Close");

                        newItem.DropDownItems.Add(focusItem);
                        newItem.DropDownItems.Add(restoreItem);
                        newItem.DropDownItems.Add(minimizeItem);
                        newItem.DropDownItems.Add(maximizeItem);
                        //newItem.DropDownItems.Add(grabItem);
                        newItem.DropDownItems.Add(releaseItem);
                        newItem.DropDownItems.Add(resetPositionItem);
                        newItem.DropDownItems.Add(closeItem);


                        focusItem.Click += delegate
                                                {
                                                    SetForegroundWindow(process.MainWindowHandle);
                                                };
                        restoreItem.Click += delegate
                                                    {
                                                        ShowWindowAsync(process.MainWindowHandle, SwShownormal);
                                                    };
                        minimizeItem.Click += delegate
                                                    {
                                                        ShowWindowAsync(process.MainWindowHandle, SwShowminimized);
                                                    };
                        maximizeItem.Click += delegate
                                                    {
                                                        ShowWindowAsync(process.MainWindowHandle, SwShowmaximized);
                                                    };
                        //grabItem.Click += delegate
                        //                      {
                        //                          while (SetParent(process.MainWindowHandle, Form1.Self.Handle) ==
                        //                                 (IntPtr)0)
                        //                          {
                        //                          }
                        //                      };
                        releaseItem.Click += delegate
                                                    {
                                                        while (SetParent(process.MainWindowHandle, (IntPtr)0) ==
                                                            (IntPtr)0)
                                                        {
                                                        }
                                                    };
                        resetPositionItem.Click += delegate
                                                        {
                                                            SetWindowPos(process.MainWindowHandle, (IntPtr)0, 0, 0, 0, 0, NOZORDER | NOSIZE | SHOWWINDOW);
                                                        };
                        closeItem.Click += delegate
                                                {
                                                    process.CloseMainWindow();
                                                };

                        key.Exited += delegate
                                            {
                                                MainGlueWindow.Self.msProcesses.BeginInvoke(
                                                    new EventHandler(
                                                        delegate { MainGlueWindow.Self.msProcesses.Items.Remove(newItem); }));
                                            };

                        //Reset position of window
                        // March 3, 2012
                        // Victor Chelaru
                        // Not sure why we
                        // are resetting the
                        // position of the window
                        // but it makes it snap to
                        // the top left.  For some users
                        // this makes the position hide behind
                        // the taskbar, making it hard to move the
                        // window.  For reference: http://www.hostedredmine.com/issues/154415                        
                        //SetWindowPos(process.MainWindowHandle, (IntPtr)0, 0, 0, 0, 0, NOZORDER | NOSIZE | SHOWWINDOW);

                        MainGlueWindow.Self.BeginInvoke(
                            new EventHandler(delegate { MainGlueWindow.Self.msProcesses.Items.Add(newItem); }));
                    }
                    catch(Exception exception)
                    {
                        // Unknown error, but we'll just keep going.
                        removeProcess.Add(key);
                        continue;
                    }
                }


                foreach (var process in removeProcess)
                {
                    Processes.Remove(process);
                }
            }
        }