Вывести окно на передний план после сбоя Mutex - PullRequest
1 голос
/ 14 ноября 2009

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

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

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

Ответы [ 4 ]

2 голосов
/ 14 ноября 2009

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

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

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

вы найдете пример именованной общей памяти в Windows SDK. хотя в этом примере используется прямой Win32 API, я вполне уверен, что вы можете выполнить что-то эквивалентное в C #.

2 голосов
/ 14 ноября 2009

В .Net встроена функция , которая позволяет второму экземпляру вашего приложения обмениваться данными с первым экземпляром, вызывая событие в первом экземпляре. Хотя он является частью VB.Net, он может использоваться также с C #.

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

2 голосов
/ 14 ноября 2009

Вам нужно получить 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 голосов
/ 23 февраля 2010

Google для ForceForegroundWindow (если вы находитесь на Windows), в любом случае

...