3

フルスクリーンで実行されるネイティブWindowsGUIを備えた大規模なC++コードベースがあります。その一部は、その上に表示されるWPFウィンドウによって交換されるものとします。ウィンドウは次のように設定されます。

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

これにより、ウィンドウがアプリケーションの残りの部分にシームレスにブレンドされます。ウィンドウの呼び出しは、次のようにC ++/CLIから実行されます。

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

_parentHwndは、ネイティブアプリケーションのHWNDです。前述のように、アプリケーションは常にフルスクリーンで表示されます。WPFウィンドウをクリックすると、Windowsタスクバーが表示されます。タスクバーが表示されないようにするにはどうすればよいですか?

4

2 に答える 2

2

私はこのクラス(ネット上のどこかでアイデアが見つかりました)を使用して、タスクバーを表示/非表示にしました。

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);
    }
}

Windows XP / Vista/7で動作します。

于 2012-06-06T07:26:53.147 に答える
1

Flot2011 の回答により、自分のウィンドウが別のフルスクリーン ウィンドウに属するふりをすることができました不足している部分について知りたい方のために、以下にそれらを示します。 アクティブ化および非アクティブ化されたイベントのハンドラーを実装します

<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();
}

それで、今何が起こるのですか?フルスクリーンであるため、メイン アプリケーションではタスクバーが消えます。オーバーレイされたウィンドウをクリックすると、タスクバーがアクティブになりますが、プロパティ イベントによって非アクティブになります。したがって、マッシュアップは 1 つのフルスクリーン アプリケーションのように動作します。

一部は、screenマルチモニターのセットアップを処理することです。(マッシュアップ) アプリケーションがプライマリ モニターで全画面表示されている場合にのみ、タスクバーを非表示にする必要があります。現在のソリューションでは、WPF ウィンドウと基礎となるフルスクリーン アプリケーションが同じ画面上にあることを前提としています。

これらのものを使用する場合は、およびへのscreen参照を含めることを忘れないでください。名前空間が .net のものと衝突するため、使用法はここではあまり良い考えではありません。System.DrawingSystem.Window.Forms

于 2012-06-06T15:32:48.910 に答える