2013-10-22 3 views
0

ScreenBounds을 고려한 프로그램을 작성하려고하고 있는데, 창이 여러 화면에 걸쳐있는 경우 창이 가장 가까운 가장자리에 "스냅"됩니다. . 윈도우에서 가장 면적이 Screen예상치 못한 .Size를보고하지 않는 교차 (250x250) 교차점입니다.

위의와
[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은 창을 이동할 때마다 변경되며 hwndinterwithscreen 계산에서 가장 가까운 경계 인 Screen.AllScreens[0]을 고려한 것으로 보입니다.

매우 명확한 문서 인 System.Drawing.Rectangle.Intersect()을 오해하고있는 경우를 제외하고는 이상한 점이 있습니다.

hwndinterwithscreen.Size은 다른 번호를보고하고 있습니까?

+1

GetWindowRect() : 당신은 정적 메소드 Screen.FromControl를 사용하여 시도 할 수 있습니다. 어떤 정의가 다른가. –

답변

1

당신은 GetWindowRect 함수에서 잘못된 구조Rectangle를 사용, 당신은 다음과 같이 정의 할 수 있습니다 the RECT structure을 사용해야합니다 :

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

, 윈도우가 가장 교차점을 가지고있는 Screen를 얻을 수 그것은 RECT 반환하는 사각형을 반환하지 않습니다

Screen scr = Screen.FromControl(yourForm); 
+0

감사합니다. 다른 hwnd의 교차 영역을 내 양식이 아닌 다른 곳으로 끌어 내려고 시도하고 있으므로이 방법이 효과가 없을 것이라고 생각합니다 (?). – mbrownnyc

+1

@mbrownnyc 물론, 우리는 정적 메소드'Screen.FromHandle'을 가지지 않을 것입니다. 대신에 그것을 사용할 수 있습니다. –

+0

다시 킹 킹 : https://github.com/mbrownnycnyc/keep_on_screener – mbrownnyc