Как сделать аналогичное реал модовому прямому акцесу к текстовой видео памяти юзая winapi ?

Тема в разделе "WASM.WIN32", создана пользователем kas1e, 31 июл 2005.

  1. kas1e

    kas1e New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    48
    Адрес:
    moskow
    Вот маленьки .com под реал моду с использованием биосовых интов и прямого доступа к текстовой видео-памяти. Все что делает это выводит пару разноцветных строк. Теперь вопрос, как сделать аналогичное под виндой, юзая только стандартные либы и винапи. Тоесть включить определенный режим (фул скрин) и в нем работать с текстом в цвете. Само собой, чтобы в фулскрин разворачиволось само если это всеже эмуль доса будет :)





    [​IMG] _930874374__BIOSINTS.COM
     
  2. n0p

    n0p 10010000b

    Публикаций:
    0
    Регистрация:
    7 май 2003
    Сообщения:
    256
    Адрес:
    Новосиbeerск
    Есть такая функция - SetConsoleTextAttribute. Нужна она именно для того, чтобы играться с цветом текста и фона (16 цветов). Ну а вывод на консоль - WriteConsole :)



    Вот с разворотом в фулскрин сложнее - тут думать надо..



    Вообще, можно поиграться с SetConsoleWindowInfo, но это не совсем то - изменяет размеры и положение окна.
     
  3. kas1e

    kas1e New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    48
    Адрес:
    moskow
    Может сделать так: установить 640на480 фулскрин виндовыми средствами(возможно? в смысле не директикс и тд, а штатными) ,уже на нем сделать консоль и ее растянуть на 640на480. В итоге получим уже рабочую область, и на ней WrriteConsole/SetconsoleTextAttrib ?
     
  4. alpet

    alpet Александр

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

    <font size=1>
    Код (Text):
    1.  
    2. #include <windows.h>
    3. #include <stdio.h>
    4.  
    5. // prototypes
    6. BOOL FullScreenConsole9x(void);
    7. BOOL FullScreenConsoleNT(void);
    8.  
    9. // ---------------------------------------------------------------------- -----
    10. BOOL FullScreenConsole9x(void)
    11. {
    12.     BOOL ok = FALSE;
    13.  
    14.         // console finding guid
    15.         // a unique number to identify this console - replace this with your own
    16.         #define CON_GUID TEXT("CON_GUID-{68E311EF-BF32-4b0f-8D35-E84E4A463096}")
    17.  
    18.         // hwnd for console window
    19.         HWND hConWnd = NULL;
    20.  
    21.     // magic command
    22.     WPARAM magic = 57359;
    23.  
    24.         // buffer for storing a substitute title
    25.         TCHAR szTempTitle[] = CON_GUID;
    26.  
    27.         // buffer for storing current console title
    28.         TCHAR szTempString[MAX_PATH];
    29.  
    30.         // obtain the current console title
    31.         if( GetConsoleTitle(szTempString, sizeof(szTempString)/sizeof(TCHAR) ) )
    32.         {
    33.                 // replace the current title with substitute title
    34.                 SetConsoleTitle(szTempTitle);
    35.  
    36.                 // give it a chance to set in
    37.                 Sleep(50);
    38.  
    39.                 // locate the console window
    40.  
    41.                 // console window class on W9x is "tty"
    42.                 hConWnd = FindWindow(TEXT("tty"), szTempTitle);
    43.  
    44.                 // restore the original console title
    45.                 SetConsoleTitle(szTempString);
    46.  
    47.         }
    48.  
    49.         // verify the console hwnd
    50.         if ( hConWnd != NULL ) {
    51.  
    52.             // pause before changing to fullscreen
    53.         Sleep(450);
    54.  
    55.         // this method works by faking a keyboard command
    56.         SendMessage(hConWnd,WM_COMMAND,magic,0);
    57.  
    58.         ok = TRUE;
    59.  
    60.         }
    61.  
    62.     return ok;
    63.  
    64. }
    65.  
    66. // ---------------------------------------------------------------------- -----
    67. BOOL FullScreenConsoleNT(void)
    68. {
    69.     // typedef function pointer for undocumented API
    70.     typedef BOOL WINAPI (*SetConsoleDisplayModeT)(HANDLE,DWORD,DWORD*);
    71.  
    72.     // declare one such function pointer
    73.     SetConsoleDisplayModeT SetConsoleDisplayMode;
    74.  
    75.         // load kernel32.dll
    76.         HINSTANCE hLib = LoadLibrary("KERNEL32.DLL");
    77.     if ( hLib == NULL ) {
    78.         // highly unlikely but good practice just the same
    79.         return FALSE;
    80.     }
    81.  
    82.         // assign procedure address to function pointer
    83.         SetConsoleDisplayMode = ( SetConsoleDisplayModeT )
    84.                 GetProcAddress(hLib,"SetConsoleDisplayMode");
    85.  
    86.         // check if the function pointer is valid
    87.     // since the function is undocumented
    88.         if ( SetConsoleDisplayMode == NULL ) {
    89.         // play nice with windows
    90.             FreeLibrary(hLib);
    91.                 return FALSE;
    92.         }
    93.  
    94.         DWORD newmode = 1;      // fullscreen mode
    95.         DWORD oldmode;
    96.  
    97.         // get handle to stdout
    98.         HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    99.  
    100.         // pause before changing to fullscreen
    101.         Sleep(500);
    102.  
    103.         // set full screen mode
    104.         SetConsoleDisplayMode(hStdOut,newmode,&oldmode);
    105.  
    106.     // play nice with windows
    107.         FreeLibrary(hLib);
    108.  
    109.     return TRUE;
    110.  
    111. }
    112.  
    113. // ---------------------------------------------------------------------- -----
    114. int main(void)
    115. {
    116.  
    117.     OSVERSIONINFO VerInfo;
    118.     ZeroMemory(&VerInfo,sizeof(VerInfo));
    119.     VerInfo.dwOSVersionInfoSize = sizeof(VerInfo);
    120.     GetVersionEx(&VerInfo);
    121.  
    122.         // Why a switch? because I felt like switching... har har
    123.     switch ( VerInfo.dwPlatformId ) {
    124.  
    125.                 case VER_PLATFORM_WIN32_NT :
    126.                 FullScreenConsoleNT();
    127.                         break;
    128.  
    129.                 case VER_PLATFORM_WIN32_WINDOWS :
    130.                 FullScreenConsole9x();
    131.                         break;
    132.  
    133.                 default:
    134.                         break;
    135.  
    136.     }
    137.  
    138.         // issue a report
    139.         printf("This is a test.\nHit enter to exit");
    140.  
    141.         // wait for keyboard hit
    142.         getchar();
    143.  
    144.     return 0;
    145. }
    146.  


    </font><!--size-->

    <font color="#CC0000]По правилам форума большой кодезь - аттачем.</font><!--color-->
     
  5. kas1e

    kas1e New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    48
    Адрес:
    moskow
    2alpet

    Проверил - да, и под win9x и под xp работает норм.



    ps. И может кто посоветует сорцов/примеров по работе с консолью. Как всякие цветастые тексты выводить ну и в таком духе.
     
  6. n0p

    n0p 10010000b

    Публикаций:
    0
    Регистрация:
    7 май 2003
    Сообщения:
    256
    Адрес:
    Новосиbeerск
    Ну рисовать шедевральные полотна в консоли - это символы псевдографики. Ну а работа с консолью, вроде, ничего сложного из себя не представляет - 4-5 апишек, в СДК или МСДН ищи слово Console. В МСДН где-то видел список всех функций для работы с консолью с кратеньким описанием.
     
  7. kas1e

    kas1e New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    48
    Адрес:
    moskow
    Еще вопрос. Каким образом скрыть в фулскриновой консоли курсор мыши ? ShowCursor(0) для мыши не катит (не работает в консоли видимо?). Текстовый курсор вполне по SetConsoleCursorInfo скрывается, а мышиный глаза мозолит.



    И еще один до кучи :) Каким образом лучше/быстрее всего будет делать очистку консоли ? 80x25 буфер пробелов както не то..
     
  8. alpet

    alpet Александр

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

    В аттаче проект работающий на редирект консоли в обычное окно. Выполняет Low-Level чтение консоли, так что можно запускать и DOS приложения, и к примеру Far. Впринципе на большинство вопросов по сабжу отвечает. Написан на Delphi 6.
     
  9. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Либо аттачи глючат, либо одно из двух.

    Вот на сайт выложил: Download