2013-10-29 5 views
1

내 애플리케이션 용 스냅인 기능을 (프로 그램 방식으로) 어떻게 비활성화 할 수 있습니까? 아니면 응용 프로그램이 찍혔는지 감지 할 수있는 방법이 있습니까? 구체적으로 API 함수를 호출하여이를 언nap합니까?Win32가 "스냅"을 방지합니다

SetWindowPos() 또는 ShowWindow()를 호출해도 올바르게 해제되지 않습니다 * (SW_MAXIMIZE). SetWindowPos()를 호출하면 나중에 SetWindowPos() 및 MoveWindow()를 호출 할 때 이상한 동작이 발생합니다. 동일한 불일치는 최대화 된 창에 적용되지 않습니다.

+1

Microsoft는 Aero Snap 용 API를 공개하지 않기로 결정했습니다. –

+0

네, 그럴 것 같습니다. 그것은 불행한 점은 창을 열어서 OpenGL을위한 전체 화면으로 이동해야한다는 것입니다. 방금 오늘이 버그를 발견했습니다. 창의 극대화는 먼저 그것을 비 웁니다. –

+0

@JonathanPotter Microsoft가 API를 공개하지 않으면 ** 해킹을 찾아야합니다. ** 가능한 해결책은 제 대답이지만 Window 스타일을 일시적으로 수정하지 않고도 두 번째 해결 방법이 있습니다 : WM_SYSCOMMAND : SC_MOVE'와'WM_SYSCOMMAND : SC_SIZE'가 있습니다. 두 번째 솔루션은 미래 및 다른 시스템에서도 동일하게 작동합니다. – 18C

답변

0

SW_MAXIMIZE를 사용하여 ShowWindow()를 호출하여 비틀 거리는 방법을 알아 냈습니다. 이 값은 다른 값이이 호출과 스냅되지 않으므로 이상합니다. 창이 이동할 수는 있지만 여전히 화면의 측면에 고정되어 있습니다. 이를 극대화하면 문제가 해결되고, 그 후에는 필요한 곳에 창을 옮길 수 있습니다.

0
#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_MAXIMIZEWS_MAXIMIZEBOX이 비활성화되면 스냅 비헤이비어가 비활성화됩니다.

SC_SIZE|9은 반 초 동안 다시 그리기를 차단하지 않고 SC_MOVE|2과 동일합니다.

최대화 된 창을 완전히 최대화 한 상태에서 끌기를 사용하지 않으려면 시스템 메뉴에서 SC_MOVE 항목의 상태를 확인하고 사용 가능한 경우 WM_SYSCOMMAND에 0을 직접 반환하십시오.

Verified on Windows 8.1.