none
タスクバーの位置 RRS feed

  • 質問

  • いつもお世話になります。

    Windows XP/7上で動作するWindowsフォームアプリケーションでタスクバーの位置を取得するにはどうすれば良いのでしょうか?

    2012年12月19日 9:58

回答

  • お手軽かつ確実ではない方法としては、以下のプロパティを比較することができます。

    • Screen.PrimaryScreen.Bounds
    • Screen.PrimaryScreen.WorkingArea

    単純に、

    var ps = Screen.PrimaryScreen;
    if (ps.Bounds.Width = ps.WorkingArea.Width)
    {
        // 画面の幅と、作業領域の幅が同じであれば、
        // タスクバーは上か下にあるだろう
        if (ps.WorkingArea.Top == 0)
        {
            // 画面の一番上が作業領域なら、
            // タスクバーは下にあるだろう
        }
        else
        {
            // 画面の一番上が作業領域ではないなら、
            // タスクバーは上にあるだろう
        }
    }
    else
    {
        // 画面の幅と、作業領域の幅が異なるならば
        // タスクバーは左か右にあるだろう
        if (ps.WorkingArea.Left == 0)
        {
            // 画面の一番左が作業領域なら、
            // タスクバーは右にあるだろう
        }
        else
        {
            // 画面の一番左が作業領域ではないなら、
            // タスクバーは左にあるだろう
        }
    }

    確実ではない理由として、

    • Windowsでは複数のアプリケーションバーを作成できるため、それに対応していない。(2本以上のAppBarがあると誤認識する)
    • Windowsではマルチモニタをサポートしているため、1番モニタにタスクバーがあるとは限らない。(特定のモニタにしか存在しなかったり、複数モニタに貫通している場合がある)

    といったところがあります。確実な方法が必要であれば、AppBar に関する API を P/Invoke で呼び出すことになるかと思います。

    2012年12月19日 13:29

すべての返信

  • お手軽かつ確実ではない方法としては、以下のプロパティを比較することができます。

    • Screen.PrimaryScreen.Bounds
    • Screen.PrimaryScreen.WorkingArea

    単純に、

    var ps = Screen.PrimaryScreen;
    if (ps.Bounds.Width = ps.WorkingArea.Width)
    {
        // 画面の幅と、作業領域の幅が同じであれば、
        // タスクバーは上か下にあるだろう
        if (ps.WorkingArea.Top == 0)
        {
            // 画面の一番上が作業領域なら、
            // タスクバーは下にあるだろう
        }
        else
        {
            // 画面の一番上が作業領域ではないなら、
            // タスクバーは上にあるだろう
        }
    }
    else
    {
        // 画面の幅と、作業領域の幅が異なるならば
        // タスクバーは左か右にあるだろう
        if (ps.WorkingArea.Left == 0)
        {
            // 画面の一番左が作業領域なら、
            // タスクバーは右にあるだろう
        }
        else
        {
            // 画面の一番左が作業領域ではないなら、
            // タスクバーは左にあるだろう
        }
    }

    確実ではない理由として、

    • Windowsでは複数のアプリケーションバーを作成できるため、それに対応していない。(2本以上のAppBarがあると誤認識する)
    • Windowsではマルチモニタをサポートしているため、1番モニタにタスクバーがあるとは限らない。(特定のモニタにしか存在しなかったり、複数モニタに貫通している場合がある)

    といったところがあります。確実な方法が必要であれば、AppBar に関する API を P/Invoke で呼び出すことになるかと思います。

    2012年12月19日 13:29
  • K. Takaoka様

    アドバイス有難うございます。

    おかげさまで解決しましおた。

    感謝します。

    2012年12月20日 4:26