none
タスクバーの裏にフォームを表示するには? RRS feed

  • 質問

  • VS2012 windows 7 x64 エアロ環境有り で作業しています。

    この際にC#フォーム(x64)をモニタと同じ解像度で作成した場合、フォームがタスクバーの上に表示されてしまい、

    タスクバーが隠れてしまいます。

    他のウィンドウがアクティブになるとタスクバーが上面に出てくる為、タスクバーが表示されたり消えたりし、非常に見づらい状態となっています。

    これを解決する方法はないでしょうか?

    やりたいこと:モニタと同じ解像度で、最大化ではない状態の際に、フォームの上にタスクバーを出したい

    引用開始

            // Program Manager のハンドルを取得する
            System.IntPtr hProgramManagerHandle = FindWindow(null, "Program Manager");
    
            // 正しく取得できた場合は、Program Manager を親ウィンドウに設定する
            if (! hProgramManagerHandle.Equals(System.IntPtr.Zero)) {
                SetParent(this.Handle, hProgramManagerHandle);
            }

    引用終了

    上記のソースコードのようなサンプルがネット上にいくつか存在し、実際にタスクバーの背面に表示されますが

    プログラムマネージャーの子になった影響下、タスクバーからフォームが消えてしまい、選択することができなくなりました。

    よろしくお願いします。

    2014年12月10日 0:48

回答

  • Windows 7からタスクバーは常に表示する仕様になったぽいですね。

    (参考)
    タスクバーを「他の窓の手前に表示しない」ことはできないのでしょうか。
    http://answers.microsoft.com/ja-jp/windows/forum/windows_7-desktop/%E3%82%BF%E3%82%B9%E3%82%AF%E3%83%90%E3%83%BC/b851c34e-f4f0-4b0a-9c1d-22606205b099

    で、解決策をネットで探していると、やはり、FormBorderStyleを変更して対応しているようです。
    あと、たまたま私がテストしてみたのですが、1ピクセルでもサイズを小さくすると、私の環境ではタスクバーが隠れなくなりました。
    つまり、1920 x 1080の解像度に対して、フォームのサイズを1919 x 1080にするとタスクバーが現れました。完璧な対処療法ですが・・・


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2014年12月11日 7:59
    • 回答としてマーク mogja 2014年12月11日 13:47
    2014年12月10日 5:08
    モデレータ

すべての返信

  • >この際にC#フォーム(x64)をモニタと同じ解像度で作成した場合、フォームがタスクバーの上に表示されてしまい、

    通常は、フォームはタスクバーの下に表示されるはずですが、何か設定されているのでしょうか? 全く同じ環境で試してみましたが、やはり、フォームはタスクバーの下に表示されました。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    2014年12月10日 1:15
    モデレータ
  • 有難うございます、再確認してみました。

    FormBorderStyleの指定がSizable以外を指定していた場合、全面に出てしまうようです。

    Fixed3Dを現在指定しておりました。

    Fixed3Dの仕様なのでしょうか?


    • 編集済み mogja 2014年12月10日 2:17
    2014年12月10日 2:15
  • 少し調べてみました。Form.FormBorderStyle プロパティが以下の場合、Formがタスクバーの前面に表示されることが判りました。

    FixedSingle
    Fixed3D
    FixedDialog
    上記以外に設定したタスクバーの背後に表示されます。これ、どうやら仕様のようですね。
    試してませんがプログラムマネージャーの子にした上で Form.ShowInTaskbar を True にしてみてはいかがでしょうか?でもプログラムマネージャーの子になった場合は駄目そうな予感が。



    MSDNフォーラムのヘルプは以下ご覧ください http://social.technet.microsoft.com/wiki/contents/articles/7359.forums-help-faq.aspx



    2014年12月10日 2:56
    モデレータ
  • Windows 7からタスクバーは常に表示する仕様になったぽいですね。

    (参考)
    タスクバーを「他の窓の手前に表示しない」ことはできないのでしょうか。
    http://answers.microsoft.com/ja-jp/windows/forum/windows_7-desktop/%E3%82%BF%E3%82%B9%E3%82%AF%E3%83%90%E3%83%BC/b851c34e-f4f0-4b0a-9c1d-22606205b099

    で、解決策をネットで探していると、やはり、FormBorderStyleを変更して対応しているようです。
    あと、たまたま私がテストしてみたのですが、1ピクセルでもサイズを小さくすると、私の環境ではタスクバーが隠れなくなりました。
    つまり、1920 x 1080の解像度に対して、フォームのサイズを1919 x 1080にするとタスクバーが現れました。完璧な対処療法ですが・・・


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2014年12月11日 7:59
    • 回答としてマーク mogja 2014年12月11日 13:47
    2014年12月10日 5:08
    モデレータ
  • 有難うございます。Form.ShowInTskbarは有効にしていても、プログラムマネージャーの子にした場合は表示されないようです
    2014年12月11日 13:48
  • 参考までに。
    http://msdn.microsoft.com/ja-jp/library/cc144179(v=vs.85).aspx

    SetWindowPos を使用して、ウィンドウの四角形のサイズを画面と同じサイズに明示的に設定することによって、タスク バーを覆い隠すこともできます。Windows 2000 以降のシステムでは、ウィンドウは WS_CAPTION または WS_THICKFRAME が設定されていない必要があります。あるいは、クライアント領域が画面全体を覆うようにウィンドウのサイズを変更する必要があります。

    WS_THICKFRAME はサイズ変更が可能なウィンドウの枠を持つかどうかのウィンドウスタイルなので、Fixed 系に設定している場合はこのウィンドウスタイルを持ちません。つまり、上記の条件を満たす=仕様通りということになります。
    (日本語がわかりづらいですが、”「ウィンドウがタイトルバーを持っていない」か、「ウィンドウがサイズ固定である」のいずれかを満たし、かつウィンドウサイズが画面と同じサイズであればタスクバーは後ろに回る” ということです)

    2014年12月11日 22:02
    モデレータ