2013-10-29 130 views
1

如何禁用我的應用程序(程序)的Windows 7的捕捉功能?或者有什麼方法可以檢測應用程序是否已被捕捉,並且特別調用API函數來取消捕捉它?Win32防止窗口「捕捉」

調用SetWindowPos()或ShowWindow()不能正確解除它*(SW_MAXIMIZE)。在將來調用SetWindowPos()和MoveWindow()時,調用SetWindowPos()會引起奇怪的行爲。相同的不一致不適用於最大化的窗口。

+1

微軟選擇不公開Aero Snap的API。 –

+0

是的,似乎是這樣。不幸的是,一個快照窗口必須取消綁定才能用於OpenGL的全屏顯示。我今天剛剛發現了這個bug。最大化窗口首先將其取消。 –

+0

@JonathanPotter如果微軟不公開一個API,我們應該爲它找到一個解決方法**第一個可能的解決方案是在我的答案中,但是沒有瞬態修改窗口樣式的第二個解決方案:爲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。

已在Windows 8.1上驗證。