質問

私は、フォームが最後の画面上に配置された場所へとユーザの好みを覚えてアプリケーションを開発しています。いくつかの例では、ユーザは、二画面に有するであろう、そして次に(画面をオフに表示され、時には形を有する)第2のスクリーンなし後アプリを起動します。他の時間は、ユーザが同様の効果が得られ、それらの解像度を変更します。

私はForm_Shownイベントハンドラでは、このチェックを行うことを期待していました。基本的に私は、私はそれを再配置することができて、フォームが完全に画面から外れているかどうかを判断します。

任意のアドバイスはありますか?

役に立ちましたか?

解決

フォームが完全に画面上のである場合には、この機能を確認してください

public bool IsOnScreen( Form form )
{
   Screen[] screens = Screen.AllScreens;
   foreach( Screen screen in screens )
   {
      Rectangle formRectangle = new Rectangle( form.Left, form.Top, 
                                               form.Width, form.Height );

      if( screen.WorkingArea.Contains( formRectangle ) )
      {
         return true;
      }
   }

   return false;
}
それは、画面上にある場合は、

のみの左上のポイントをを確認します:

public bool IsOnScreen( Form form )
{
   Screen[] screens = Screen.AllScreens;
   foreach( Screen screen in screens )
   {
      Point formTopLeft = new Point( form.Left, form.Top );

      if( screen.WorkingArea.Contains( formTopLeft ) )
      {
         return true;
      }
   }

   return false;
}

他のヒント

「IntersectsWith」-methodとLINQ-拡張子を持つ上記のすべてのソリューションを組み合わせることで、短い中で私たちを与えます

public bool IsOnScreen(Form form) 
{
   // Create rectangle
   Rectangle formRectangle = new Rectangle(form.Left, form.Top, form.Width, form.Height); 

   // Test
   return Screen.AllScreens.Any(s => s.WorkingArea.IntersectsWith(formRectangle));
}

(すべての回答に基づいて)ここに完全なソリューション。 Iは画素の少なくともこの%は、すべての画面/ディスプレイを横切って表示されなければならないパラメータMinPercentOnScreenを追加しました。したがって、このリターンはfalse場合はデフォルトに戻って、ウィンドウの位置を移動する必要があります。

// Return True if a certain percent of a rectangle is shown across the total screen area of all monitors, otherwise return False.
public bool IsOnScreen(System.Drawing.Point RecLocation, System.Drawing.Size RecSize, double MinPercentOnScreen = 0.2)
{
    double PixelsVisible = 0;
    System.Drawing.Rectangle Rec = new System.Drawing.Rectangle(RecLocation, RecSize);

    foreach (Screen Scrn in Screen.AllScreens)
    {
        System.Drawing.Rectangle r = System.Drawing.Rectangle.Intersect(Rec, Scrn.WorkingArea);
        // intersect rectangle with screen
        if (r.Width != 0 & r.Height != 0)
        {
            PixelsVisible += (r.Width * r.Height);
            // tally visible pixels
        }
    }
    return PixelsVisible >= (Rec.Width * Rec.Height) * MinPercentOnScreen;
}

実装ます:

return IsOnScreen(this.Location, this.Size);

古いスレッドが、それでも便利! コードのためのコーディとAndrija-感謝。私は微調整のカップルをしなければなりませんでした。 代わりにscreen.WorkingArea.Intersect(formRectangle)の;私はformRectangle.Intersect(screen.WorkingArea)を使用しました。交差するので()交差点でそのオブジェクトを置き換えます。フォームが完全に画面から外れている場合には、交差点の後formRectangleは(0,0,0,0)であり、そして含み()がtrueを返します。だから私はまたformRectangle上、左、幅と高さが真を返す前に、すべて0でないかどうかを確認します。どの部分が画面上にない場合は、フォームのいずれかの部分が偽の画面上にある、とあれば、今のコードはtrueを返します。

のための WPF の(マティアスLoerkesの回答に基づいて)

のSystem.Windows.Forms System.Drawing

への参照を追加します。
//using System.Windows.Forms;

public bool IsOnScreen(Window window)
{
   var windowRect = new System.Drawing.Rectangle((int)window.Left, (int)window.Top, (int)window.Width, (int)window.Height);
   return Screen.AllScreens.Any(s => s.WorkingArea.IntersectsWith(windowRect));
}
これらの作品の

なしモニタがオフであることを起こる場合。 Screen.AllScreens関数は常に1がオフの場合でも、スクリーンの数を返します。

あなたは、ウィンドウを配置する前に

画面の解像度を確認してください。それはあなたがどこで、実際にそれを行う前に、解像度の境界の外側に置きに行く場合は、あなたが把握できるようになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top