Я пишу код управления окном в C. Когда определенные флаги установлены, я хочу иметь максимально развернутое окно, которое нельзя изменить, перетащив окно по строке заголовка. Есть ли способ «заблокировать» максимизированное окно в его максимизированном состоянии?Предотвращение выхода из режима максимального окна
ответ
Попробуйте этот
case WM_SYSCOMMAND:
if(IsMaximized(hwnd) && ((wParam & 0xFFF0) == SC_RESTORE || (wParam & 0xFFF0) == SC_MOVE)){
return 0;
}
break;
Редактировать
Полный код
switch(message){ //handle the messages
...
...
case WM_SYSCOMMAND:
...
break;
....
default: //for messages that we don't deal with
return DefWindowProc(hwnd, message, wParam, lParam);
}
return DefWindowProc(hwnd, message, wParam, lParam);
Это значение по умолчанию WindowProcedure. Я думал, что это было известно.
Вальтера
ответ Valter показывает, как перехватить действия пользователя и отменить изменения состояния окна на этом этапе. Это, однако, не будет обрабатывать изменения состояния, выполненные с использованием Win API напрямую (например, ShowWindow
).
API Windows предлагает еще один вариант, который обеспечивает более точное управление изменениями состояния/положения окна. Он также более гибкий: например, он позволяет применять ограничения, определенные приложением, в позиции окна. Опция WM_WINDOWPOSCHANGING
сообщение и ее обработчик. Окно получает указатель на структуру, которую он может изменить, чтобы настроить желаемое состояние и положение. Таким образом, принудительное максимизированное состояние обрабатывает более широкий диапазон сценариев.
Пока это сообщение обрабатывается, изменение любого из значений в WINDOWPOS влияет на новый размер окна, положение или место в порядке Z. Приложение может предотвратить изменения в окне, установив или очистив соответствующие биты в члене флагов WINDOWPOS.
Вы также можете прочитать об этом сообщении в блоге Raymond Chen: Use WM_WINDOWPOSCHANGING to intercept window state changes.
Есть также несколько вопросов здесь, на SO, а также, это выглядит близко к вашим и ответ также предоставляет фрагмент кода, а также: Detect window restore operation is about to begin
- 1. Предотвращение выхода esc из полноэкранного режима
- 2. Предотвращение выхода окна из MDI без подергивания?
- 3. Предотвращение выхода из Excel
- 4. Вспышка AIR: предотвращение выхода из полноэкранного режима с командой + w
- 5. Предотвращение выхода из полноэкранного режима при нажатии «ESC» в Flex
- 6. Предотвращение максимального окна WPF из панели задач покрытия
- 7. Предотвращение режима таблеток от максимальной ширины окна
- 8. Предотвращение выхода Javascript из текста?
- 9. Предотвращение выхода PictureBox из экрана
- 10. Предотвращение выхода из выселения из кэша Guava
- 11. Предотвращение спящего режима
- 12. Карта: w для выхода из режима вставки и нормального режима
- 13. Нажмите ESC для выхода из полноэкранного режима
- 14. Ошибка выхода из черепахового окна
- 15. Предотвращение разметки из-за размера окна
- 16. Предотвращение выхода WindowsService
- 17. PHP - Предотвращение выхода пользователей из системы
- 18. Предотвращение выхода из приложения при обратном доступе
- 19. Предотвращение входа пользователя после выхода из системы
- 20. Предотвращение просмотра страницы после выхода из системы
- 21. Предотвращение перетаскивания изображения для выхода из экрана
- 22. Предотвращение выхода из системы auth laravel
- 23. Предотвращение выхода приложения из UIWebView link
- 24. Предотвращение выхода из терминала Gnome после выполнения
- 25. Функция окна: поиск максимального значения из LAG()
- 26. Предотвращение выхода Emacs после завершения процедуры выхода?
- 27. JavaFX 8: пустая сцена после выхода из режима ожидания
- 28. Предотвращение выхода onComplete в Jasmine
- 29. Предотвращение захвата окна
- 30. Как предотвратить переадресацию javascript из выхода из полноэкранного режима?
Это почти сработало, я сделал небольшую корректировку. Я проверяю SC_MOVE вместо SC_RESTORE следующим образом: 'if (((wParam & 0xFFF0) == SC_MOVE) && (style & WS_MAXIMIZE)) return 0;'. Также важно вернуть DefWindowProc, когда он не возвращает нуль, иначе все остальные syscommands будут проигнорированы. Спасибо за ваш ответ! –
@JobTalle Вот почему у нас есть оператор * break *. См. Править –