2017-05-20 1 views
0

비활성 인 경우 맨 위의 창을 얻는 방법 :이 확인을 작동 What is the correct way to create a single-instance application?는 모달과 내가 같은 시스템에 여러 번 그래서 난이 스레드에서 솔루션을 사용하는 내 응용 프로그램을 실행하는 사용자를 방지 할

을하지만 모달 창이 열릴 때 내 응용 프로그램을 표시하는 데 문제가 있습니다 (예 : view.ShowDialog();). 이것은 시나리오입니다.

  1. 사용자가 내 응용 프로그램을 실행하고 모달 창을 엽니 다.
  2. 그런 다음 그는 응용 프로그램을 다시 실행하려고 시도합니다. 응용 프로그램의이 두 번째 인스턴스의 시작 절차에있는 코드는 다른 응용 프로그램을 실행 중임을 확인하고 WM_SHOWME 메시지를 표시하여 자체적으로 표시합니다. 그런 다음 응용 프로그램의 두 번째 인스턴스가 종료됩니다.
  3. 첫 번째 응용 프로그램은 How to handle WndProc messages in WPF?의 솔루션을 사용하여 WM_SHOWME 메시지를받습니다. 이제 최상위 창을 맨 앞으로 가져와야하며 이것이 내 질문입니다. 최상위 창이 모달이고 활성화되지 않은 경우 어떻게하면 응용 프로그램의 최상위 창을 얻을 수 있습니까? Refer to active Window in WPF?에서 해결책을 시도했지만, 물론 내 윈도우가 활성화되어 있지 않아 작동하지 않습니다.

PS - 응용 프로그램이 실행 중이고 모달 창이 열리 며 작업 표시 줄의 아이콘 위로 마우스를 가져 가면 주 창과 모달 창이라는 두 개의 창을 볼 수 있습니다. 메인 윈도우를 클릭 할 수 있습니다. (모달 윈도우가 위에 있기 때문에 비활성화되어 있습니다) 모달 윈도우도 클릭 할 수 있습니다. 내 솔루션은 메인 윈도우를 클릭하는 것처럼 작동하지만, 최상위 윈도우를 활성화 할 수 있기를 원합니다.이 경우에는 모달입니다.

그럼, 최상위 모달 창 (또는 모달 창이 표시되지 않은 경우 주 창)을 앞으로 가져 오는 방법에 대한 아이디어는 무엇입니까? 응용 프로그램주고 기계의 단일 인스턴스를 만들 수

+1

흠, 메인 윈도우와 모달 윈도우 (대화 상자) 아이콘을 모두 보여주는 작업 표시 줄은 의도적입니까? 이 대화 상자는 주 창에서 소유하지 않은 것 같습니다. 대화 상자를 주 창에서 소유하게 만들면 대화 상자가 주 창에 절대 적용되지 않습니다. 또한 메인 윈도우를 앞으로 가져 가면 모달 윈도우도 앞쪽으로 가져옵니다. (모덜 윈도우의 [Owner property] (https://msdn.microsoft.com/en-us/library/system.windows.window.owner (v = vs.110) .aspx)를 확인하십시오. 메인 윈도우로) – elgonzo

+0

@elgonzo - 당신이 맞습니다, 소유자 속성을 설정하는 것을 잊었습니다, 고마워요! 대답으로 의견을 게시하면 동의 할 것입니다. – sventevit

+0

끝났습니다 ... :) – elgonzo

답변

1

질문에 설명 된대로 동작하면 기본 창은 대화를 소유하지 않고 임을 나타냅니다.

대화 상자가 (메인) 창에 의해 소유되면 창은 대화 상자를 덮을 수 없습니다 (대화 상자는 일반적으로 항상 창 상단에 있습니다). 이것은 또한 창을 앞으로 가져 가면 대화 상자가 창의 맨 위에 표시되므로 문제가 깔끔하게 해결됩니다.

대화 상자 (모달 창)의 소유자 설정은 비교적 쉽습니다. 그것은 또한 메인 화면의 아이콘/섬네일을하고자하는 경우 작업에 나타납니다

Window modalWindow = ... create modal window instance 
modalWindow.Owner = mainWindow; 
modalWindow.ShowDialog(); 

(사이드 참고 : 간단하게이 예제와 유사한 대화 상자를 표시하기 전에 당신에게 주 창을 그 Owner 속성을 설정 bar이면 모달 윈도우의 ShowInTaskbar 속성을 false으로 설정해야합니다.

+1

이전에 말했듯이 - 당신의 솔루션이 작동합니다. 비록 당신이 Owner 속성을 설정했다 할지라도 작업 표시 줄의 아이콘 위로 마우스를 가져 가면 메인 윈도우와 대화 상자를 볼 수 있습니다. 그러나 이드는 당신이 클릭 한 창에 상관 없습니다. 모달은 항상 위에 있습니다. – sventevit

+1

@sventevit, 하하, 네 말이 맞아. 모달 창은 일반적으로 작업 표시 줄에 표시됩니다. 이것이 원하지 않으면 ShowInTaskbar를 false로 설정해야합니다. 나는 습관적으로 그렇게한다. WPF의 습관과 내 습관을 혼동스럽게 생각합니다 :) 잠시 후에 내 대답의 영향을받는 부분을 다시 작성하겠습니다 ... – elgonzo

0

가장 좋은 방법은

뮤텍스는 두 가지 유형이다

여기 Mutex

이 같은 문서에서 발췌 뮤텍스 명명 된 사용하는 것입니다 : 이름없는 로컬 뮤텍스와 명명 된 시스템 뮤텍스. 로컬 뮤텍스는 프로세스 내에서만 존재합니다. 뮤텍스를 나타내는 뮤텍스 개체에 대한 참조가있는 프로세스의 모든 스레드에서 사용할 수 있습니다. 이름이 지정되지 않은 Mutex 객체는 각각 별도의 로컬 뮤텍스를 나타냅니다. 명명 된 시스템 뮤텍스는 운영 체제 전체에서 볼 수 있으며 프로세스 활동을 동기화하는 데 사용할 수 있습니다.

이름을 허용하는 생성자를 사용하여 명명 된 시스템 뮤텍스를 나타내는 Mutex 개체를 만들 수 있습니다. 운영체제 객체는 동시에 생성 될 수도 있고 뮤텍스 객체 생성 전에 존재할 수도 있습니다. 동일한 명명 된 시스템 뮤텍스를 나타내는 여러 Mutex 개체를 만들 수 있으며 OpenExisting 메서드를 사용하여 기존 명명 된 시스템 뮤텍스를 열 수 있습니다.

어쨌든 첫 번째 인스턴스를 전달하려는 경우를 처리했습니다.

관련 문제