0

Screen Boundsウィンドウが複数の画面にまたがる場合、ウィンドウは、ウィンドウの領域が最も近い最も近い端に「スナップ」するプログラムを作成しようとしてScreenいます。

[DllImport("user32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool GetWindowRect(IntPtr hWnd, ref Rectangle lpRect);

Rectangle rct = new Rectangle();
GetWindowRect(hwnd, ref rct);

if (rct.IntersectsWith(Screen.AllScreens[0].Bounds))
{
    Rectangle hwndinterwithscreen = Rectangle.Intersect(rct, Screen.AllScreens[0].Bounds);
    MessageBox.Show("hwnd: " + hwnd.ToInt32().ToString() + " intersects with: " + Screen.AllScreens[0].DeviceName + " at: " + hwndinterwithscreen.Location + " that is this big: " + hwndinterwithscreen.Size);
}
}

上記の場合、非常に奇妙な結果が表示されます: 1) 上部のメッセージ バーの中心が移動されScreen.AllScreens[0]ても と重なるScreen.AllScreens[0]場合、条件は入力されません。2)hwndinterwithscreen.Sizeウィンドウを移動するたびに変化Screen.AllScreens[0]し、hwndinterwithscreen計算では最も近い境界を考慮しているようです。

System.Drawing.Rectangle.Intersect()に関する非常に明確なドキュメントを誤解していない限り、何かが異常です。

hwndinterwithscreen.Sizeが異なる数値を報告している理由。

4

1 に答える 1

1

関数で間違った構造 Rectangleを使用しました。次のように定義できる構造を使用する必要があります。GetWindowRectRECT

public struct RECT {
   public int left, top, right, bottom;
}

ただし、Screenウィンドウの交差が最も多い を取得するには、静的メソッドを使用してみてくださいScreen.FromControl

Screen scr = Screen.FromControl(yourForm);
于 2013-10-22T20:46:14.753 に答える