2012-02-17 5 views
0

COM 포트의 입력을 기반으로 두 개의 타사 응용 프로그램간에 전환 할 수 있어야합니다. 즉, 장치에서 Command1을 수신하면 App1을 활성 (맨 위) 창으로 만들고 장치에서 Command2을 받으면 App2를 활성 창으로 만듭니다. 왜 내가 이걸하고 싶어? 이 응용 프로그램은 셀프 서비스 스테이션에서 실행되며 모션 센서의 입력을 모니터링합니다. 그래서 어느 누구도 방송국 앞에서 App2 (예 : 광고)를 보여줄 필요가 없으며 누군가 앞에 서 있으면 App1 (예 : 메인 애플리케이션)을 표시해야합니다.Windows에서 활성 창을 변경하는 방법은 무엇입니까?

백그라운드에서 실행되는 응용 프로그램을 생각하고 COM 포트의 입력을 수신하고 이에 따라 활성 창을 전환합니다. 그래서 문제는 어떻게 .NET을 사용하여 활성 창을 바꿀 수 있습니까? OS는 Windows XP Pro SP2이지만 Windows 7에서도 작동하는 것이 좋습니다.

+0

참고 : 사용자 데스크톱과 상호 작용하는 간단한 서비스와 같은 것은 아닙니다. http://stackoverflow.com/questions/267838/how-can-a-windows-service-execute-a-gui-application –

+0

Windows 서비스는 Windows Vista를 시작으로 사용자의 데스크톱과 상호 작용할 수 없습니다. 어쨌든 서비스가 아니어야합니다. 백그라운드 응용 프로그램 (즉, 양식을 표시하지 않는 표준 양식 응용 프로그램) 만 작성하면됩니다. 또한 활성 창을 변경하면 근본적으로 문제가 발생합니다. 이는 사용자가 할 수 있어야하는 것이지 응용 프로그램이 할 수없는 것입니다. Windows는 모든 단계에서 여러분과 싸우며 사용자는 그리 행복하지 않을 것입니다. –

+0

질문을 "background app"으로 변경했습니다. 감사합니다. _why_에 대한 추가 정보도 추가했습니다. – MarioVW

답변

2

사용할 수 있습니다.

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

그런 다음 관련 프로세스를 이름 또는 루프 GetProcesses 등으로 찾으십시오. 단일 인스턴스를 가정하면 :

Process[] process = Process.GetProcessesByName("myapp"); 
if (process.Length > 0 && process[0].MainWindowHandle != IntPtr.Zero) { 
    SetForegroundWindow(process[0].MainWindowHandle); 
} 
+0

당신이 말하는 모든 것이 사실이지만 ['SetForegroundWindow'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms633539.aspx)가 함께 제공된다는 사실을 지적해야합니다. 정황. 앞에서 설명한 것처럼, 활성 창을 응용 프로그램 내에서 다른 프로세스가 소유 한 창으로 변경하려고 시도하는 것은 일반적으로 권장되지 않습니다. 악의적 인 응용 프로그램이 사용자를 괴롭히기 위해이 작업을 수행하는 방법을 찾았으며 Windows 팀은 천천히이 작업을 수행하고 있습니다. 아마이 코드는 다른 앱이 작업 표시 줄 버튼을 깜박이게 할 것입니다. –

+0

나는 당신의 코드를 시험해 보았고 실제로 작동한다. 내 응용 프로그램에서 두 프로세스 (타사 응용 프로그램)를 생성하여 도움이되었을 수도 있다는 사실을 지적하고자합니다. 여전히 마우스가 움직일 때 윈도우를 전환하는 대신 작업 표시 줄을 깜박이기 때문에 동작이 다소 모순됩니다. 어쨌든,이 솔루션은 내 요구에 충분히 좋은 것 같습니다. – MarioVW

관련 문제