2009-11-14 4 views
1

Мне было интересно, может ли кто-нибудь сказать, что было бы лучшим способом принести мое приложение на передний план, если бы мьютекс не смог быть создан для нового экземпляра.Принесите окно на передний план после выхода Mutex.

Например: приложение X работает, но находится в фоновом режиме. Я не вижу его, поэтому я пытаюсь запустить другой экземпляр; потому что мьютекс возвращает false, лучше всего принести существующий экземпляр на передний план.

Кто-нибудь знает, как лучше всего взаимодействовать с вашим собственным приложением, но от отдельного процесса?

ответ

2

Вам нужно будет получить hWnd в главном окне другого приложения. Единственный способ, которым я помню, как это сделать, - это перебрать все окна, пока вы не найдете их. Может быть более прямой путь

[DllImport("user32.dll")] private static extern 
       int EnumWindows(EnumWindowsProc ewp, int lParam); 

public delegate bool EnumWindowsProc(int hWnd, int lParam); 

public void EnumerateAllWindows() 
{ 
    EnumWindowsProc ewp = new EnumWindowsProc(EvalWindow); 
    EnumWindows(ewp, 0); 
} 

private bool EvalWindow(int hWnd, int lParam) 
{ 
    //this will be called for each window..   
    // use GetWindowThreadProcessId to get the PID for each window 
    // and use Process.GetProcessById to get the PID you are looking for 
    // then bring it to foregroun using of these calls below: 

} 

    [DllImport("user32.dll")] 
    public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

    [DllImport("user32.dll")] 
    public static extern bool BringWindowToTop(IntPtr hWnd); 

    DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd 
+0

благодаря Radu, как я могу получить главное окно HWND? – Grant

2

Один из способов достижения вашей цели - создать именованную общую память.

Первое приложение создаст именованную общую память и сохранит ее дескриптор окна, идентификатор процесса или любую другую полезную для этой цели информацию.

Когда второе приложение пытается создать общую память с тем же именем, она будет извлекать дескриптор для той же разделяемой памяти, в то время как возвращаемое значение скажет вам, что этот объект уже существует. второе приложение может затем прочитать дескриптор окна из общей памяти и любой другой информации. он может затем использовать BringWindowToTop(), SetForegroundWindow() или такой.

вы найдете an example of a named shared memory в Windows SDK. в то время как этот пример использует прямой API Win32, я уверен, что вы можете выполнить что-то эквивалентное на C#.

2

Существует feature, встроенный в .Net, чтобы второй экземпляр вашего приложения обменивался данными с первым экземпляром, создавая событие в первом экземпляре. Хотя это часть VB.Net, это can be used с C# тоже.

Однако это очень важно, чтобы быть в курсе ошибок . С некоторыми брандмауэрами, impossible открыть даже один экземпляр - ваше приложение падает при запуске! См. this excellent article Билл МакКарти для получения более подробной информации и альтернативной техники. Он передает со второго экземпляра обратно в первый экземпляр с помощью труб в .NET 3.5. Я рекомендую вам использовать это. Его код VB.Net, но вы, вероятно, могли бы convert to C# with Telerik.

0

Google для forceForegroundWindow (если вы на окнах), во всяком случае