Здравствуйте, ABCDEFG, Вы писали:
ABC> Я проверил, действительно SetForegroundWindow не поднимает окно если вызов из другого процесса, неужели остается только Remoting?
У меня вот так уже давно работает:
.......
......
bool createdNew;
System.Threading.Mutex mutex = new System.Threading.Mutex(false, "My mutex", out createdNew);
if (!createdNew)
{
//получаем имя нашего процесса (название файла без расширения '.exe')
string processName = System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName;
processName = processName.Substring(0, processName.IndexOf(".exe"));
System.Diagnostics.Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
//перебираем все процессы с искомым именем
foreach(System.Diagnostics.Process process in System.Diagnostics.Process.GetProcessesByName(processName))
{
//текущий экземпляр нас не интересует
if (process.Id == currentProcess.Id)
continue;
//могут быть разные приложения с одинаковым именем
//исполняемого файла. Проверяем что-бы это был 'наш' файл
if (process.MainModule.FileName != currentProcess.MainModule.FileName)
continue;
//Активизируем основное окно приложения
SetForegroundWindow(process.MainWindowHandle);
ShowWindow(process.MainWindowHandle, SW_MAXIMIZED);
return;
}
}
......
......
}
[System.Runtime.InteropServices.DllImport("User32.dll")]
static extern int SetForegroundWindow(IntPtr hWnd);
const int SW_MAXIMIZED = 3;
[System.Runtime.InteropServices.DllImport("User32.dll")]
static extern int ShowWindow(IntPtr hWnd, Int32 Mode);
Особых глюков не замечено
Вместо SW_MAXIMIZED можно использовать другие константы.
... << RSDN@Home 1.1 beta 2 >>