2012-10-19 4 views
4

Windows 서비스에서 이미 실행중인 Windows 데스크톱 응용 프로그램으로 메시지를 전달하려고합니다. Windows 서비스에서 타이머를 구현했습니다. 간격 후에 서비스는 Windows 응용 프로그램에 메시지를 보냅니다.C#을 사용하여 Windows 서비스에서 Windows 서비스로 메시지를 전달하는 방법은 무엇입니까?

서비스 또는 발신자 번호는 아래와 같다 : 상기 코드는 잘 작동

protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 232) 
     { 
      MessageBox.Show("Received"); 
     } 
     else 
     { 
      base.WndProc(ref m); 
     } 
    } 

두 프로세스 윈도우가있을 때 다음과 같이

System.Diagnostics.Process[] lProcs = System.Diagnostics.Process.GetProcessesByName("TestProcess2"); 

     if (lProcs.Length > 0) 
     { 
      IntPtr handle = lProcs[0].MainWindowHandle; 

      if (handle != IntPtr.Zero) 
       SendMessage(handle, 232, IntPtr.Zero, IntPtr.Zero); 
     } 

및 윈도우 데스크탑 어플리케이션 (수신기) 코드는 데스크톱 응용 프로그램. 보낸 사람으로 Windows 서비스를 사용하면 Windows 데스크톱 응용 프로그램 프로세스에서 메시지를받을 수 없습니다. 도와 줄수있으세요?

+0

파이프 또는 루프백 소켓 연결을 보았습니까? –

답변

2

두 개의 프로세스가 다른 사용자 계정으로 실행되고 있기 때문입니다.

나는 당신이 볼 여기서, 수신 할 수 있도록 변경 메시지 필터 기능을 사용할 필요가 있다고 생각 :이 작업을 수행하는

ChangeWindowMessageFilterEx function

+0

'Justin Hrvey'에게 감사드립니다. 두 프로세스 모두 동일한 사용자 계정에서 실행됩니다. –

3

두 개의 다른 윈도우 스테이션. 보안상의 이유로 별도의 Window Stations에서 실행되는 응용 프로그램간에 창 메시지를 보내는 것은 불가능합니다.

서비스와 데스크톱 응용 프로그램간에 통신하려면 일종의 프로세스 간 통신 방법 (소켓, 명명 된 파이프, DCOM 등)이 필요하며이 중 하나 위에 실행되는 일부 프레임 워크 예 : Remoting 또는 WCF.