2011-07-04 2 views
0

내 응용 프로그램에 영구 상태를 설정하고 싶습니다. 설명하겠습니다. 시작 시간이 다소 길다. (대개 원격 서버에 대한 많은 데이터베이스 요청으로 인해 5 ~ 10 초가 걸리고 내 사용자는 대개 너무 많은 응용 프로그램을 실행하므로 ...) &을 숨기는 방법은 필요할 때 내 응용 프로그램을 보여줍니다.WPF - 작업 관리자에서 숨겨졌지만 활성 상태 인 응용 프로그램 표시

내가 지금하고있는 일은 사용자가 적십자를 클릭했을 때만 응용 프로그램을 줄이기위한 것입니다. (응용 프로그램은 실제로 사용자가 파일 -> 종료를 선택할 때만 종료됩니다.)

모든 사용자는 설치된 버전을 확인한 다음 온라인에서 사용 가능한 버전을 확인하는 설치 프로그램을 실행하고 필요에 따라 실행하기 전에 해당 프로그램을 업데이트합니다.

이제 프로세스 모니터 (프로세스 관리자 탭의 프로세스 모니터)를 확인하고 프로세스가 이미 응용 프로그램에 대해 실행되고 있으면 창이 다시 표시됩니다. 그렇지 않으면 프로세스가 실행되고 있지 않으면 classic-check-for-update-then-launch 단계를 처리 할 수 ​​있습니다. 이것은 내가 정기적으로 가지고있는 어리석은 고객 요청을 많이 제거합니다. ("어이, 응용 프로그램을로드하는 데 시간이 너무 오래 걸리므로 다시 5 번 클릭하고 6 개의 인스턴스를 실행했습니다 !!!!": /) 따라서 저장하십시오 나에게 많은 쓸모없는 시간이 그들에게 그것을 더 빨리 만들지 않을 것이기 때문에 동일한 어플리케이션의 50 인스턴스를 시작하는 것을 멈추도록 요청했다. ...

그래서 나의 주요 질문은 : C#/WPF에서 그런 트릭을 수행하는 방법이다. ? 당분간, 내 최소화 프로세스는 다소 간단합니다. 단지 : & 작업 표시 줄 항목을 숨기고 있습니다. 이제는 내 설치자에게 다시 보여줄 방법을 모르겠습니다.

아이디어가 있으십니까?

+0

정말 좋은 생각입니다. 또한 스플래시 화면이 나타나야하고 사용자가 앱이로드된다는 의견을 제시하고 초기 검색어를 백그라운드 스레드에서 처리 할 수 ​​있다고 말하고 싶습니다. –

+0

로드 상태를 완벽하게 명확하게 보여주는 스플래시 화면이 이미 있습니다. 문제는 6 개 이상의 스크린에서 항상 20 개 이상의 애플리케이션을 실행하고있는 상인을 위해 일하고 있습니다. 'TopMost'방식으로 스플래시 스크린을 유지할 수 없습니다. 이는 자신의 작업을 방해 할 수 있고 애플리케이션을 확인하지 않고 다시. NotifyIcon을 정보에 추가하거나 TopMost의 작은로드 진행률 막대를 추가하려고 시도했지만 계속해서 4 ~ 5 번 실행합니다. 이제 불행히도 다른 방법으로 작업 할 때입니다./ – Damascus

답변

3

고객의 요청은 결코 바보가 될 수 없습니다. 돈을 지불합니다.

윈도우를 앞쪽으로 가져 오려면 시스템 전체 뮤텍스를 만들고 응용 프로그램 시작시 그 존재를 확인하십시오. 거기에 있다면 - 프로세스 간 통신 메커니즘을 사용하여 그 다른 인스턴스로 메시지를 보내서 메인 윈도우를 앞에 놓으십시오 (윈도우 메시지 또는 명명 된 파이프 - 모두 괜찮습니다). 여기 an example입니다 (관련 답변도 확인하시기 바랍니다).

그리고 언제든지 응용 프로그램을 다시 시작하는 것을 방지하기 위해 가능한 한 빨리 splash screen을 표시하십시오. 1-2 초 안에 나타나지 않으면 (2가 너무 길어진다) 나쁘다. 응용 프로그램의 응답 성으로 인해 작동 속도가 빨라집니다. Window.Visibility를 사용하여 창을 숨길 Visibility.Hidden로 설정하고 Visibility.Visible에 다시 보여 : 실종

+0

링크를 제공해 주셔서 감사합니다! 나는 그것이 완벽하게 논리로 보였기 때문에 생략했다. 그러나 나는 스플래시 스크린을 가지고있다. 내가 확인해 볼게. – Damascus

2

이게 뭔가요? LINQ와

foreach (var p in Process.GetProcesses()) 
{ 
    if (p.ProcessName.Contains("myProcess")) 
    { 
     //process is already running 
    } 
} 

또는 : 사용자가 시작 시간에 대해 불평하면

if (Process.GetProcesses().Where(p => p.ProcessName.Contains("myProcess")).Any()) 
{ 
    //process is already running 
} 

는, 어쩌면 대신 시작으로, 출구의 버전을 확인하는 것이 좋습니다.

+0

동시에 두 개의 응용 프로그램 인스턴스를 시작하면 다른 응용 프로그램이 모두 실행 중이며 둘 다 종료된다는 점은 무엇입니까? – svick

+0

사실,하지만 그것은 내가 생각하는 최후의 경우 일 것이다. 그럼에도 불구하고, 당신 말이 맞습니다. – Peter

+1

엣지 케이스를 처리 할 필요가 없다면 프로그래밍이 쉬울 것입니다. – svick

관련 문제