2012-06-04 1 views
2

커다란 C++ 코드베이스를 가지고 있으며 전체 화면으로 실행되는 기본 Windows GUI가 있습니다. 일부는 그 위에 표시된 WPF 창으로 교환해야합니다. 창은 다음과 같이 설정 :작업 표시 줄이 WPF가 아닌 전체 화면 창과 함께 나타나지 않게하려면 어떻게합니까?

<Window WindowState="Normal" 
     WindowStyle="None" 
     ShowInTaskbar="False" 
     AllowsTransparency="True" 
/> 

이 응용 프로그램의 나머지 부분에 윈도우 원활한 조화를 이루고 있습니다. 윈도우의 호출이나은과 같이/CLI ++ C에서 수행됩니다

Windows::Window^ w = window(); 
Windows::Interop::WindowInteropHelper iHelp(w); 
iHelp.Owner = System::IntPtr(_parentHwnd); 
w->Show(); 

_parentHwnd 네이티브 응용 프로그램의 HWND입니다. 애플리케이션은 항상 전체 화면으로 표시됩니다. 이제 WPF 창을 클릭하면 Windows 작업 표시 줄이 나타납니다. 작업 표시 줄이으로 나타나지 않게하려면 어떻게해야합니까?

답변

2

내가/숨기기 작업 표시 줄 보여주기 위해 (아이디어는 인터넷 어딘가에 발견)이 클래스를 사용했습니다 : 윈도우 XP/Vista/7에

public static class Taskbar 
{ 
    [DllImport("user32.dll")] 
    private static extern int FindWindow(string className, string windowText); 
    [DllImport("user32.dll")] 
    private static extern int ShowWindow(int hwnd, int command); 

    private const int SW_HIDE = 0; 
    private const int SW_SHOW = 1; 

    public static int Handle 
    { 
     get 
     { 
      return FindWindow("Shell_TrayWnd", ""); 
     } 
    } 
    public static int StartHandle 
    { 
     get 
     { 
      return FindWindow("Button", "Start"); 
     } 
    } 

    public static void Show() 
    { 
     ShowWindow(Handle, SW_SHOW); 
     ShowWindow(StartHandle, SW_SHOW); 
    } 

    public static void Hide() 
    { 
     ShowWindow(Handle, SW_HIDE); 
     ShowWindow(StartHandle, SW_HIDE); 
    } 
} 

작품.

+0

답변 해 주셔서 감사합니다. 나는 그걸 시험해 본다. 내가 돌아 오기 전에 하루가 걸릴지 모른다. – Pascal

+0

흥미 롭습니다. 나는 이것을 심각한 해킹이라고 생각하지만 우리의 필요를 채운다. 고맙습니다. – Pascal

1

Flot2011로 대답 this 내 창을 다른 전체 화면 창에 속인 척할 수있었습니다. 누락 된 부분에 대한 호기심 사람들을 위해 - 여기 그들은 같습니다 우리는 활성화 및 비활성화 이벤트

에 대한 처리기를 구현
<Window 
Activated="DisplayWindow_Activated" 
Deactivated="DisplayWindow_Deactivated" 
/> 

이벤트 핸들러 무슨 일이 이제 어떻게 그래서이

private void DisplayWindow_Activated(object sender, EventArgs e) 
{ 
    var screen = System.Windows.Forms.Screen.FromRectangle(
    new System.Drawing.Rectangle(
     (int)this.Left, (int)this.Top, 
     (int)this.Width, (int)this.Height)); 
    if(screen.Primary) 
    Taskbar.Hide(); 
} 

private void DisplayWindow_Deactivated(object sender, EventArgs e) 
{ 
    var screen = System.Windows.Forms.Screen.FromRectangle(
    new System.Drawing.Rectangle(
     (int)this.Left, (int)this.Top, 
     (int)this.Width, (int)this.Height)); 
    if(screen.Primary) 
    Taskbar.Show(); 
} 

처럼? 작업 표시 줄은 전체 화면이므로 기본 응용 프로그램에서 사라집니다. 중첩 된 창을 클릭하면 작업 표시 줄이 활성화되지만 특성 이벤트에 의해 비활성화됩니다. 따라서 매쉬업은 하나의 전체 화면 응용 프로그램처럼 작동합니다.

screen 부분은 멀티 모니터 설정을 처리하는 것입니다. (매시업) 응용 프로그램이 기본 모니터에서 전체 화면으로 표시되는 경우 작업 표시 줄 만 숨겨야합니다. 현재 솔루션은 WPF 창과 기본 전체 화면 응용 프로그램이 동일한 화면에 있다고 가정합니다.

screen 자료를 사용하는 경우 System.DrawingSystem.Window.Forms에 대한 참조를 포함해야합니다. 네임 스페이스가 .net의 항목과 충돌하기 때문에 여기서는 사용법이별로 좋지 않습니다.

관련 문제