#define WM_RESTOREORIGINALSTYLE WM_USER+... /* your first free USER message */
case WM_SYSCOMMAND:
{
if(wParam==(SC_MOVE|2)) wParam=SC_SIZE|9;
if((wParam&0xFFE0)==SC_SIZE && (wParam&0x000F)) // handles MOVE and SIZE in one "if"
{
long int oldStyle=GetWindowLongW(hwnd,GWL_STYLE);
PostMessageW(hwnd,WM_RESTOREORIGINALSTYLE,GWL_STYLE,oldStyle);
SetWindowLongW(hwnd,GWL_STYLE,oldStyle &0xFEFEFFFF); // disable WS_MAXIMIZE and WS_MAXIMIZEBOX
DefWindowProcW(hwnd,WM_SYSCOMMAND,wParam,lParam);
return 0;
}
return DefWindowProcW(hwnd,WM_SYSCOMMAND,wParam,lParam);
}
case WM_RESTOREORIGINALSTYLE:
{
if((long int)wParam==GWL_STYLE)
SetWindowLongW(hwnd,GWL_STYLE,lParam);
return 0;
}
PostMessage는 후속 메시지 루프에서 처리됩니다. 즉, move-size 루프를 입력 한 후 최대한 빨리 처리됩니다. 프레임의 자체 그리기 방법을 사용하는 경우 WM_STYLECHANGED
메시지에 프레임을 올바르게 다시 그리는 것을 잊지 마십시오. 클래스의 oldStyle을 내부적으로 저장하십시오. 왜 작동합니까? Windows는 이동/크기 동작 시작시 스냅 상태를 확인합니다. 시작시 WS_MAXIMIZE
및 WS_MAXIMIZEBOX
이 비활성화되면 스냅 비헤이비어가 비활성화됩니다.
SC_SIZE|9
은 반 초 동안 다시 그리기를 차단하지 않고 SC_MOVE|2
과 동일합니다.
최대화 된 창을 완전히 최대화 한 상태에서 끌기를 사용하지 않으려면 시스템 메뉴에서 SC_MOVE 항목의 상태를 확인하고 사용 가능한 경우 WM_SYSCOMMAND
에 0을 직접 반환하십시오.
Verified on Windows 8.1.
출처
2017-09-09 15:42:00
18C
Microsoft는 Aero Snap 용 API를 공개하지 않기로 결정했습니다. –
네, 그럴 것 같습니다. 그것은 불행한 점은 창을 열어서 OpenGL을위한 전체 화면으로 이동해야한다는 것입니다. 방금 오늘이 버그를 발견했습니다. 창의 극대화는 먼저 그것을 비 웁니다. –
@JonathanPotter Microsoft가 API를 공개하지 않으면 ** 해킹을 찾아야합니다. ** 가능한 해결책은 제 대답이지만 Window 스타일을 일시적으로 수정하지 않고도 두 번째 해결 방법이 있습니다 : WM_SYSCOMMAND : SC_MOVE'와'WM_SYSCOMMAND : SC_SIZE'가 있습니다. 두 번째 솔루션은 미래 및 다른 시스템에서도 동일하게 작동합니다. – 18C