Console Window: Changing styles

Тема в разделе "WASM.WIN32", создана пользователем alpet, 7 сен 2005.

  1. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Почему блокируется возможность установки стиля консольного окна (да и вообще SetWindowLong безпомощна в отношеннии окна консоли).

    Скажем консоль создается через AllocConsole(), дескриптор ее окна получается с помощью FindWindow(...). Окно можно передвигать, изменять в размерах, скрывать, но вот SetWindowLong всегда завершается со статусом ERROR_ACCESS_DENIED. Можно ли как другим способом изменять параметры окна, помимо SetWindowLong/SetWindowLongPtr?
     
  2. ViP912

    ViP912 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    4
    Адрес:
    Russia
    А какие параметры консольного окна ты хочешь поменять, если не секрет? Щас посмотрел описание SetWindowLong из MSDN и чё-то не нашёл ничего по консольным окнам.
     
  3. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    ViP912

    Желательно изменить стиль (GWL_STYLE), поскольку требуется убрать системное меню окна и кнопки (-WS_SYSMENU, -WS_MAXIMIZEBOX, -WS_MINIMIZEBOX).

    Вообще-то в MSDN совсем недокументировано, что для окон(принадлежащих текущему процессу и потоку) могут быть заданы какие-то ограничения (права).
     
  4. ViP912

    ViP912 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    4
    Адрес:
    Russia
    Насколько мне известно, изменить подобные параметры для консольного окна нельзя. Можно посмотреть описание этих функций, и использовать их:

    SetConsoleCP

    SetConsoleCtrlHandler

    SetConsoleCursorInfo

    SetConsoleCursorPosition

    SetConsoleMode

    SetConsoleOutputCP

    SetConsoleScreenBufferSize

    SetConsoleTextAttribute

    SetConsoleTitle

    SetConsoleWindowInfo
     
  5. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    ViP912

    Напрямую много чего нельзя сделать. Мне не интересен набор стандартных функций, поскольку они работают с самой консолью, а не окном (как объектом USER).

    Непонятно другое - блокировка управления стилями окна по hWnd - это только для консольного окна характерно? По каким признакам система разрешает/блокирует изменение этих свойств окна?
     
  6. ViP912

    ViP912 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    4
    Адрес:
    Russia
    alpet

    Скорее всего, не только для консольного окна, но и для окон других приложений. А само окно консольного приложения, имхо, принадлежит не текущему процессу, а системе, отсюда и ACCESS_DENIED.
     
  7. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    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.
     
  8. ViP912

    ViP912 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    4
    Адрес:
    Russia
    alpet

    - это верно замечено.

    Ведь при создании консольного приложения необязательно подключать user32.dll, следовательно CreateWindow для его создания не вызывается и отрисовка самого окна производится ядром ОС.
     
  9. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    ViP912

    Консольное окно похоже сборная солянка из GDI ресурсов. Неимеет как таковой Window Extra-Memory и Class Extra-Memory. Похоже что доступ к данным обычно хранимых в этих структурах, эмулируется посредством собственной обработки вызовов соотв. функций доступа к ним. А вот Set*Long функции есстественно блокируются, поскольку работать им особо не с чем, а эмулировать их MS незахотела.



    Насчет отрисовки окна в ядре я сомневаюсь, скорее всего этим занимается окнонная процедура в gdi32.dll, надо это проверить...
     
  10. franzz

    franzz New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2005
    Сообщения:
    5