Почему блокируется возможность установки стиля консольного окна (да и вообще SetWindowLong безпомощна в отношеннии окна консоли). Скажем консоль создается через AllocConsole(), дескриптор ее окна получается с помощью FindWindow(...). Окно можно передвигать, изменять в размерах, скрывать, но вот SetWindowLong всегда завершается со статусом ERROR_ACCESS_DENIED. Можно ли как другим способом изменять параметры окна, помимо SetWindowLong/SetWindowLongPtr?
А какие параметры консольного окна ты хочешь поменять, если не секрет? Щас посмотрел описание SetWindowLong из MSDN и чё-то не нашёл ничего по консольным окнам.
ViP912 Желательно изменить стиль (GWL_STYLE), поскольку требуется убрать системное меню окна и кнопки (-WS_SYSMENU, -WS_MAXIMIZEBOX, -WS_MINIMIZEBOX). Вообще-то в MSDN совсем недокументировано, что для окон(принадлежащих текущему процессу и потоку) могут быть заданы какие-то ограничения (права).
Насколько мне известно, изменить подобные параметры для консольного окна нельзя. Можно посмотреть описание этих функций, и использовать их: SetConsoleCP SetConsoleCtrlHandler SetConsoleCursorInfo SetConsoleCursorPosition SetConsoleMode SetConsoleOutputCP SetConsoleScreenBufferSize SetConsoleTextAttribute SetConsoleTitle SetConsoleWindowInfo
ViP912 Напрямую много чего нельзя сделать. Мне не интересен набор стандартных функций, поскольку они работают с самой консолью, а не окном (как объектом USER). Непонятно другое - блокировка управления стилями окна по hWnd - это только для консольного окна характерно? По каким признакам система разрешает/блокирует изменение этих свойств окна?
alpet Скорее всего, не только для консольного окна, но и для окон других приложений. А само окно консольного приложения, имхо, принадлежит не текущему процессу, а системе, отсюда и ACCESS_DENIED.
ViP912 По всем признакам принадлежит именно текущему процессу и потоку, равно как и любой стандартный контрол. Системе единственное принадлежит - класс ConsoleWindowClass, и оконная процедура которая отрисовывает в окне содержимое буфера консоли. Кстати как я заметил - попытка использовать SetClassLong тоже оборачивается ошибкой ACCESS_DENIED, и более того, через некоторое время система начинает сильно сбоить - запуск консоли жестко ее перезагружает. Попытался достать функцией SetWindowLongPtr(W) - но что-то не обнаружу откуда ее можно импортировать (в user32.dll вроде не числится). Вобщем все вокруг окон консолей покрыто мраком недокументированных запретов, и багов системе. [edited] Нашел на одном форуме. The problem is the Console is not a true Window in the sense in belongs to your app (it belongs to the O/S). Вобщем надо забить на это окно, скрыть его, благо работает ShowWindow.
alpet - это верно замечено. Ведь при создании консольного приложения необязательно подключать user32.dll, следовательно CreateWindow для его создания не вызывается и отрисовка самого окна производится ядром ОС.
ViP912 Консольное окно похоже сборная солянка из GDI ресурсов. Неимеет как таковой Window Extra-Memory и Class Extra-Memory. Похоже что доступ к данным обычно хранимых в этих структурах, эмулируется посредством собственной обработки вызовов соотв. функций доступа к ним. А вот Set*Long функции есстественно блокируются, поскольку работать им особо не с чем, а эмулировать их MS незахотела. Насчет отрисовки окна в ядре я сомневаюсь, скорее всего этим занимается окнонная процедура в gdi32.dll, надо это проверить...