Win32 предотвращает окно "оснастки"
Как я могу отключить функцию привязки Windows 7 для моего приложения (программно)? Или есть какой-нибудь способ определить, было ли приложение привязано, и, в частности, вызвать функцию API, чтобы отсоединить его?
Вызов SetWindowPos() или ShowWindow () не удаляет его правильно *(SW_MAXIMIZE делает). Вызов SetWindowPos() фактически вызывает странное поведение в будущих вызовах SetWindowPos() и MoveWindow(). Те же самые несоответствия не применяются к окну, которое развернуто.
2 ответа
#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 будет обрабатываться в последующем цикле сообщений - это означает как можно скорее после входа в цикл перемещения размера. Если вы используете собственный метод рисования рамки, пожалуйста, не забудьте правильно перерисовать рамку на WM_STYLECHANGED
сообщение, внутренне хранить oldStyle в вашем классе. Почему это работает? Windows проверяет состояние привязки при начале действия перемещения / размера. Если WS_MAXIMIZE
а также WS_MAXIMIZEBOX
отключены при запуске, поведение привязки отключено.
SC_SIZE|9
эквивалентно SC_MOVE|2
без блокировки перерисовки на полсекунды.
Если вы не хотите включать перетаскивание развернутых окон, если они полностью развернуты, проверьте состояние элемента SC_MOVE в системном меню и, если он включен, сразу верните 0 в WM_SYSCOMMAND
,
Проверено на Windows 8.1.
Я нашел способ отсоединиться, вызвав ShowWindow() с помощью SW_MAXIMIZE. Это странно, поскольку никакие другие значения не снимаются с этим вызовом, хотя окно можно убрать, оно все еще привязано к боковой части экрана. Максимизация это решает проблему, после чего я могу переместить окно, где это должно быть.