質問
私は、フォームが最後の画面上に配置された場所へとユーザの好みを覚えてアプリケーションを開発しています。いくつかの例では、ユーザは、二画面に有するであろう、そして次に(画面をオフに表示され、時には形を有する)第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がオフの場合でも、スクリーンの数を返します。
画面の解像度を確認してください。それはあなたがどこで、実際にそれを行う前に、解像度の境界の外側に置きに行く場合は、あなたが把握できるようになります。