Переключиться на другой экземпляр того же приложения - PullRequest
1 голос
/ 08 сентября 2011

Я хочу, чтобы мое приложение winform c # переключалось на другой работающий экземпляр, если происходит определенное событие.

Например, если у меня есть приложение с одной кнопкой, и в данный момент запущены три экземпляра. Теперь, если я

  1. нажмите кнопку в первую очередь, сфокусируйтесь на второй экземпляр
  2. нажмите кнопку во второй инстанции, сфокусируйтесь на третьей инстанции
  3. нажмите кнопку в третьем экземпляре, фокусируйтесь на первом экземпляре

Как мне это сделать?

Ответы [ 2 ]

7 голосов
/ 08 сентября 2011

если вы знаете дескриптор других экземпляров, вам нужно просто вызвать Windows API: SetForegroundWindow :

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetForegroundWindow(IntPtr hWnd);

[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

вы можете использовать FindWindow вызов APIчтобы получить дескриптор других экземпляров, например:

 public static int FindWindow(string windowName)
    {
        int hWnd = FindWindow(null, windowName);

        return hWnd;
    }

, вы можете найти эти вызовы API здесь в SO, чтобы найти больше примеров, например, нашел этот:

Как мне сфокусировать чужое окно?

0 голосов
/ 08 сентября 2011

SetForegroundWindow - отличное решение.Альтернативой является использование именованного Semaphores для отправки сигналов в другие приложения.

Наконец, вы можете найти решение Inter-Process Communication (IPC), которое позволит вам отправлять сообщения между процессами.

Я написал простую библиотеку .Net XDMessaging , которая делает это действительнолегко.С его помощью вы можете отправлять инструкции из одного приложения в другое, а в последней версии даже передавать сериализованные объекты.Это многоадресная реализация, использующая концепцию каналов.

Приложение 1:

IXDBroadcast broadcast = XDBroadcast.CreateBroadcast(
                                       XDTransportMode.WindowsMessaging);
broadcast.SendToChannel("commands", "focus");

Приложение 2:

IXDListener listener = XDListener.CreateListener(
                                      XDTransportMode.WindowsMessaging);
listener.MessageReceived+=XDMessageHandler(listener_MessageReceived);
listener.RegisterChannel("commands");

 // process the message
private void listener_MessageReceived(object sender, XDMessageEventArgs e)
{
    // e.DataGram.Message is the message
    // e.DataGram.Channel is the channel name
    switch(e.DataGram.Message)
    {
        case "focus":
        // check requires invoke
            this.focus();
            break;
        case "close"
            this.close();
            break;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...