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);
}
}
}