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. Это странно, поскольку никакие другие значения не снимаются с этим вызовом, хотя окно можно убрать, оно все еще привязано к боковой части экрана. Максимизация это решает проблему, после чего я могу переместить окно, где это должно быть.

Другие вопросы по тегам