private void RefreshTimer_Tick(object sender, EventArgs e)
        {
            try
            {
                // mark current list items to remove
                foreach (var item in ProcessListView.Items.Cast<ProcessItem>())
                    item.Purge = true;

                string pipePath = @"\\.\pipe\";
                String[] pipes = Directory.GetFiles(pipePath)
                                    .Where(p => p.StartsWith(pipePath + "xray_"))
                                    .ToArray();

                foreach (var pipe in pipes)
                {
                    var host = pipe.Replace(pipePath, "");

                    string url = "ipc://" + host + "/query";

                    var item = ProcessListView.Items.Cast<ProcessItem>().FirstOrDefault(p => p.Url == url);
                    if (item == null)
                    {
                        item = new ProcessItem(url);
                        ProcessListView.Items.Add(item);
                    }

                    item.Update();

                    item.Purge = false;
                }

                var removeItems = ProcessListView.Items.Cast<ProcessItem>().Where(p => p.Purge).ToArray();
                foreach (var item in removeItems)
                    ProcessListView.Items.Remove(item);

                LastErrorLabel.Text = "";
               }
            catch (Exception ex)
            {
                LastErrorLabel.Text = "Monitor Error: " + ex.Message;
            }
        }