Удаление 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++, чтобы исследовать структуру окна игры.

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