2011-09-07 2 views
1

특정 이벤트가 발생할 경우 내 C# winform 응용 프로그램을 다른 실행중인 인스턴스로 전환하려고합니다.동일한 응용 프로그램의 다른 인스턴스로 전환

예를 들어 버튼이있는 응용 프로그램이 있고 현재 3 개의 인스턴스가 실행중인 경우를 예로들 수 있습니다. 제가

  1. 눌러 첫번째 인스턴스에서 버튼을 지금, 만약 첫번째 인스턴스
  2. 에 초점 번째 인스턴스
  3. 눌러 번째 인스턴스에서 버튼을 초점 번째 인스턴스
  4. 눌러 번째 인스턴스에서 버튼을 집중

어떻게하면됩니까?

답변

7

방금 ​​윈도우 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 호출을 사용 할 수 있습니다, 예를 들면 :

: 당신이 그 API를 검색 할 수 있습니다
public static int FindWindow(string windowName) 
    { 
     int hWnd = FindWindow(null, windowName); 

     return hWnd; 
    } 

더 많은 예제 SO 여기에 호출, 예를 들어이 하나를 발견

How do I focus a foreign window?

+0

덕분에, 그것은 – SMUsamaShah

+0

이 SetForegroundWindow의 제한에 대해 생각해보십시오 제공. 어떤 프로세스에서든 창을 앞으로 가져올 수는 없습니다. 참조 : http://msdn.microsoft.com/en-us/library/ms633539(v=vs.85).aspx –

+0

두 인스턴스가 같은 창 이름을 가질 때 어떻게 전환됩니까? – SMUsamaShah

0

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; 
    } 
} 
관련 문제