Удаление WS_BORDER и WS_CAPTION из стилей Windows не работает
Я создал небольшое приложение на C#, которое удаляет границы и заголовки из окна, затем устанавливает размер в соответствии с разрешением пользователя и центрирует его. Это утилита для меня, когда я хочу играть в игры в оконном режиме, не раздражаясь из-за границ. В большинстве игр все работает нормально, но я попытался использовать его в недавно выпущенной игре Alpha Protocol, и она не работает. Я мог бы почти сказать, что игра отменяет мои изменения, но я не уверен, как определить, правда это или нет. Я использую импортированные функции API MoveWindow, SetWindowLong и SetWindowPos.
Snippet:
Win32.MoveWindow(hWnd, 0, 0, Convert.ToInt32(sizeXText.Text), Convert.ToInt32(sizeYText.Text), true);
Win32.SetWindowLong(hWnd, GWL_STYLE, Win32.GetWindowLong(hWnd, GWL_STYLE) & ~WS_CAPTION & ~WS_BORDER);
Win32.SetWindowPos(hWnd, 0, 0, 0, 0, SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|SWP_DRAWFRAME);
2 ответа
Каждый раз, когда вызывается SetWindowPos, он отправляет сообщение: WM_WINDOWPOSCHANGING
в окно с доступной для записи копией параметров SetWindowPos. Это дает окну возможность проверить и изменить параметры. Многие окна автоматически реагируют на изменение положения и размеров, чтобы "разумно" управлять своими украшениями, не относящимися к клиенту, - что, я полагаю, и происходит здесь. Код OnWindowPosChanging переустанавливает декорации, не относящиеся к клиенту, непосредственно перед обработкой DRAWFRAME.
Вы должны использовать Spy++, чтобы исследовать структуру окна игры.