2010-03-09 3 views
3

사용자가 바탕 화면의 작업 영역 내에서만 내 Win32 창을 끌 수있게하고 싶습니다. 즉, 모니터 외부로 창을 확장하거나 창을 작업 표시 줄과 겹치지 않아야합니다.바탕 화면 위치를 데스크톱 작업 영역으로 제한

나는 말더듬을 일으키는 방식으로하고 싶습니다. WM_MOVE 메시지를 처리하고 MoveWindow()를 호출하여 창을 다시 배치하면 작동하지만 MoveWindow()로 인해 깜박 거리는 효과는 마음에 들지 않습니다.

또한 실제로 이동하기 전에 대상 사각형을 변경하여 MoveWindow()를 호출 할 필요가없는 WM_MOVING 처리를 시도했습니다. 이것은 깜박 거리는 문제를 해결하지만 커서가 윈도우 내부에 있지 않은 상태에서 드래그하여 사용자가 윈도우를 드래그 할 수있게되면 커서가 언젠가 윈도우에서 빠져 나오게됩니다.

어떻게 이런 문제에 직면하지 않고 내 윈도우를 제한합니까?

답변

2

다중 모니터 설정을 사용하는 사용자는 x 좌표 및 y 좌표가 음수이거나 사각형이 아닌 데스크톱이있을 수 있습니다. 또한 일부 사용자는 LiteStep과 같은 다른 창 관리자를 사용합니다. LiteStep은 가상 데스크톱을 오프 스크린으로 옮겨 구현합니다. 만약 당신이 이것과 싸우려고한다면, 당신의 애플리케이션은이 사용자들을 위해 깨어날 것입니다.

0

WM_MOVING 메시지를 처리하고 lParam이 가리키는 RECT를 변경하면됩니다.

lParam : 화면 좌표의 윈도우의 현재 위치를 사용하여 RECT 구조체에 대한 포인터. 드래그 사각형의 위치를 ​​변경하려면 응용 프로그램에서이 구조의 멤버를 변경해야합니다.

당신은 또한 윈도우가 이동하기 시작하면 알 WM_ENTERSIZEMOVE을 처리 할 수 ​​있으며, WM_EXITSIZEMOVE

0

WM_GETMINMAXINFO은 당신이 찾고있는 것 같다 것입니다.

3

Windows는 궁극적으로 SetWindowPos API를 통해 배치됩니다.

SetWindowPos는 크기가있는 창을 보내거나 WM_WINDOWPOSCHANGING 메시지를 이동하여 매개 변수의 유효성을 검사하는 것으로 시작한 다음 변경된 크기 및/또는 위치를 창 proc에 알리는 WM_WINDOWPOSCHANGED 메시지를 전달합니다.

DefWindowProc 이러한 메시지를 처리하려면 WM_GETMINMAXINFO을 보내고 WM_SIZE 또는 WM_MOVE 메시지를 보내야합니다.

어쨌든 WM_WINDOWPOSCHANGING을 처리하여 범위를 벗어난 창 배치에 대한 사용자 및 코드 기반의 시도를 필터링하십시오.