2012-02-21 2 views
4

나는 Owned windows과 그 소유자 사이의 계약에 대해 알고 소유자가 숨겨지면 소유 윈도우가 숨겨져 있음을 알고 있습니다. 이것은 실제로 내가 원하는 것입니다. 문제는 이후에 소유 윈도우를 표시하면 소유자 윈도우가 최소화 된 다음 소유 윈도우가 숨겨지지 않고 화면에 정상적으로 표시된다는 것입니다. 이 경우 Window의 WindowState가 시작될 때 최소화되어 표시되는 소유 된 창이 화면에 표시됩니다.소유자가 최소화 된 후 소유 된 창을 숨기는 방법은 무엇입니까?

ShowOwnedPopups을 호출하여 OS가 모든 소유 된 창을 숨기도록 할 수 있음을 알고 있지만 소유 된 창이 실제로 표시되어 화면에 깜박임이 발생하는 경우에만 작동하는 것으로 보입니다. 윈도우를 명시 적으로 숨기려고했으나 (예 : WS_VISIBLE 비트 삭제 또는 WM_SHOWCOMMAND를 숨김으로 변경하려고 시도) 소유자가 복원 될 때 소유 윈도우가 표시되지 않습니다. 이는 ShowOwnedPopups API에 대한 문서와 일치하므로 표시되는 유일한 창은 ShowOwnedPopups 호출에 의해 숨겨진 창입니다.

그래서 OS를 소유자에게 복원 될 때까지 최종 사용자에게 표시되지 않도록하는 방법으로 창을 표시하도록하는 방법을 찾고 있습니다. - 또는 -에 플래그를 설정하는 방법 윈도우가 ShowOwnedPopups를 사용하여 윈도우를 숨겼다 고 OS가 생각한 다음 수동으로 윈도우를 숨기고 그 플래그를 설정합니다.

소유 된 창을 표시하는 코드는 셸과 연결되지 않으므로 소유자가 복원 될 때까지 소유 된 창을 표시하지 않는 것이 중요합니다. 이것은 별도의 사용자 정의 컨트롤의 일부이며이 경우에는 WPF 컨트롤이기 때문에 ElementHost에서 컨트롤을 사용할 수도 있습니다. 따라서 소유 윈도우의 WindowState도 볼 수 없습니다. 모든 Windows API 솔루션을 비록 환영합니다.

+0

소유자가 최소화 된 후 소유 된 창이 어떻게 표시됩니까? 작업 표시 줄에서 소유 된 창을 클릭 하시겠습니까? 요구 사항이 아니라면 작업 표시 줄에서 창을 숨길 수 있습니다. 그래서 소유 된 윈도우를 보여주는 것은 사용자가 훨씬 더 어려워집니다. 당신의 사건을 설명하십시오. –

+0

이 특별한 경우에 쇼는 "자동"입니다. 컨트롤은 소유 된 일부 창을 표시하는 것을 포함하여 이전 상태로 복원 중입니다. 따라서 사용자는 내 컨트롤을 창에 둡니다. 윈도우의 WindowState가 최소화로 설정됩니다. 윈도우가로드되면 OS에 의해 "최소화 된 상태"로 표시되고 컨트롤이 초기화 /로드되면 이전 상태로 복원되고 마지막으로 컨트롤이 표시되는 소유 윈도우를 표시하려고하는 일부분으로 익숙한. – AndrewS

+0

BTW 내가 의미하는 간단한 예제를 보려면 WPF 응용 프로그램을 만듭니다. 생성 한 주 창의 Window 상태를 Minimized로 설정하십시오. 로드 된 이벤트를 연결합니다. 예 : 'void MainWindow_Loaded (객체 발신자, RoutedEventArgs e) { var w = 새 창(); w.Owner = this; w.Show(); } ' – AndrewS

답변

0

이전에 내 프로젝트 중 하나에서 사용했던 약간의 트릭 (trick)으로, 보이는 영역 외부에 창을 생성하고 최소화 한 후 최소화하고 다시 보이는 영역으로 위치를 옮기는 것이 좋습니다. 아래 코드를 확인하십시오.

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    var w = new Window(); // Create window 
    w.Owner = this;   // Set this window as owner 
    w.WindowStartupLocation = System.Windows.WindowStartupLocation.Manual; // Set startup location as manual 
    w.Left = -10000;  // Set x position to -10000 (or anything which makes it out of bounds) 
    w.Top = -10000;   // Set y position to -10000 
    w.Show();    // Show window (it will not be shown, not even blink) 
    w.WindowState = System.Windows.WindowState.Minimized; // Set window as minimized 
    w.Left = 100;   // Set x position to 100 (or whatever you want) 
    w.Top = 100;   // Set y position to 100 (or whatever you want) 
} 
+0

감사하지만 기술적으로 소유자를 최소화해도 소유 된 창은 최소화되지 않습니다. 소유자가 복원 될 때까지 창을 숨 깁니다. OS가하는 일을 해보기 위해 소유 윈도우를 숨기고 싶습니다. 다시 화면에 깜박임이 없어도됩니다. 나는 그것이 화면을 벗어나고 ShowOwnedPopups (hwnd, false)를 호출 할 수 있도록 위치를 조정해야 할 수도 있지만 피할 수 있다면 오히려하지 않을 것이다. – AndrewS

+0

이것이 "더러운 트릭"이라고 불리는 이유입니다. 이것은 분명히 최선의 방법은 아니지만 해결 방법입니다. –

+0

이 솔루션을 확인하십시오. 그것은 작동하는 것 같습니다. http://social.msdn.microsoft.com/Forums/en/wpf/thread/f688e3b4-97e6-44e9-bd46-adff6c45f503 –

관련 문제