Шрифт в консоли

Тема в разделе "WASM.WIN32", создана пользователем BreakHeart, 13 ноя 2009.

  1. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Вот-вот. Подсмотреть, дизассемблировать, использовать абсолютно недокументированные SendMessage для консольного окна - а потом на Висте не сработает, и кто-нибудь будет волосы на попе по одному рвать с горя
     
  2. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    А почему в каждой строке только 7 байт?
     
  3. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    Написал на Visual C++ -> не работает=(в чем может быть проблема?код точно такой?
     
  4. 0x00000004

    0x00000004 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2008
    Сообщения:
    9
    Накосячил :). Прошу прощения!
     
  5. 0x00000004

    0x00000004 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2008
    Сообщения:
    9
    Как это выражается? Прога не компилится? Или компилится, но нет эффекта?
     
  6. 0x00000004

    0x00000004 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2008
    Сообщения:
    9
    Ну учитывая, что другого решения пока не найдено, то данный вариант вполне приемлем. Ну и вообще, все претензии к мелокомягким :)
     
  7. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    компилится но нет эффекта...и почему ваш дам отличается от того что вы использовали в программе?
     
  8. 0x00000004

    0x00000004 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2008
    Сообщения:
    9
    Хм. Странно. Проверил и на вижуалке. Работает. Правд после некоторых модификаций, так как ошибки при компиляции повалились

    Код (Text):
    1. //---------------------------------------------------------------------------
    2. #include <windows.h>
    3. #include <iostream>
    4. using namespace std;
    5.  
    6. char fontdata[] =
    7. {
    8. 0x0C, 0x01, 0x00, 0x00, 0x50, 0x00, 0x2C, 0x01,
    9. 0x50, 0x00, 0x19, 0x00, 0x6E, 0x00, 0x00, 0x00,
    10. 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00,
    11. 0x36, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00,
    12. 0x4C, 0x00, 0x75, 0x00, 0x63, 0x00, 0x69, 0x00,
    13. 0x64, 0x00, 0x61, 0x00, 0x20, 0x00, 0x43, 0x00,
    14. 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x6F, 0x00,
    15. 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00,
    16. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    17. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    18. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    19. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    20. 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    21. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
    22. 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0xF5, 0x00,
    23. 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00,
    24. 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    25. 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00,
    26. 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00,
    27. 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00,
    28. 0xC0, 0xC0, 0xC0, 0x00, 0x80, 0x80, 0x80, 0x00,
    29. 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
    30. 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00,
    31. 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x00,
    32. 0xFF, 0xFF, 0xFF, 0x00, 0x62, 0x03, 0x00, 0x00,
    33. 0x84, 0x01, 0x4E, 0x00, 0x25, 0x00, 0x53, 0x00,
    34. 0x79, 0x00, 0x73, 0x00, 0x74, 0x00, 0x65, 0x00,
    35. 0x6D, 0x00, 0x52, 0x00, 0x6F, 0x00, 0x6F, 0x00,
    36. 0x74, 0x00, 0x25, 0x00, 0x5C, 0x00, 0x73, 0x00,
    37. 0x79, 0x00, 0x73, 0x00, 0x74, 0x00, 0x65, 0x00,
    38. 0x6D, 0x00, 0x33, 0x00, 0x32, 0x00, 0x5C, 0x00,
    39. 0x63, 0x00, 0x6D, 0x00, 0x64, 0x00, 0x2E, 0x00,
    40. 0x65, 0x00, 0x78, 0x00, 0x65, 0x00, 0x00, 0x00,
    41. 0x00, 0x00, 0x00, 0x00
    42. };
    43.  
    44. int main(int argc, char* argv[])
    45. {
    46.     SetConsoleTitleA("testconwnd");
    47.  
    48.     HANDLE FMHandle;
    49.     HWND ConWnd;
    50.     LPVOID MView;
    51.  
    52.     ConWnd = FindWindowA(NULL, "testconwnd");
    53.  
    54.     if(ConWnd == NULL){ cout << "FindWindow"; goto exit;}
    55.  
    56.     FMHandle = CreateFileMappingW(
    57.         (HANDLE)0xFFFFFFFF,
    58.         NULL,
    59.         PAGE_READWRITE,
    60.         0,
    61.         sizeof(fontdata),
    62.         NULL);
    63.  
    64.     if(FMHandle == NULL) {cout << "CreateFileMappingW"; goto exit; }
    65.  
    66.     MView = MapViewOfFile(
    67.         FMHandle,
    68.         0xF001F,
    69.         0,
    70.         0,
    71.         0);
    72.  
    73.     if(MView == NULL) { cout << "MapViewOfFile"; goto exit;}
    74.  
    75.     CopyMemory(MView, fontdata, sizeof(fontdata));
    76.  
    77.     UnmapViewOfFile(MView);
    78.  
    79.     SendMessageW(ConWnd, 0x4C9, (unsigned)FMHandle, 0);
    80.  
    81.     CloseHandle(FMHandle);
    82.  
    83.     SetConsoleOutputCP(1251);
    84.     cout << "Приювет мир!" << endl;
    85.  
    86. exit:
    87.     cin.get();
    88.     return 0;
    89. }
    90. //---------------------------------------------------------------------------
    вот скрин:
    [​IMG]

    Это из-за того, что не установил достаточную ширину поля с шестнадцатеричными значениями в области дампа.
    Я этот косяк заметил позже, так что в исходнике полный дамп.
     
  9. 0x00000004

    0x00000004 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2008
    Сообщения:
    9
    сцуко! оно не пашет если его запускать через командную строку
     
  10. 0x00000004

    0x00000004 New Member

    Публикаций:
    0
    Регистрация:
    22 июл 2008
    Сообщения:
    9
    кстати. в ключе HKEY_CURRENT_USER\Console наблюдается некоторое сходство с содержимым дампа...
     
  11. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    странно но у меня все равно шрифт не меняется=(
     
  12. BreakHeart

    BreakHeart New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2009
    Сообщения:
    71
    И на этом идеи закончились?неужели никто не знает способа поменять шрифт в консоли?
     
  13. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Последний код может потому не работать, что между
    SetConsoleTitleA("testconwnd"); и FindWindowA(NULL, "testconwnd");
    Должно пройти какое-то время, у меня тоже не работало, пока я не воткнул между ними
    Код (Text):
    1. Sleep (1000);
    А из консоли запускать, да, не пашет, надо разобраться
    ++++++++++++++++++++++++++++++++++++++++++++
    Тот ещё интерес на самом деле, я сколько не пытался узнать, что это за сообщение 0x4C9, не смог у себя в хидерах найти. Что за сообщение такое 0x4C9?
     
  14. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
  15. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    amvoz
    Ваша ссылка все о том же - SetConsoleFont.

    Вы прочитали советы? попробовали? я пробовал. XP SP1, SP2, SP3, и даже один сервис-пак, но у меня - и у соседа напротив. Один и тот же "номер" шрифта дает совсем разные результаты. Есть вариант: в цикле устанавливать поочередно каждый, читать свойства шрифта, пока не попадете на, скажем, 14-пиксельный. Но гарантии, что это люцида, а не растровый - все равно не получите.
     
  16. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Ну главное, чтобы у вас работало. А если вы захотите распространит код на другие машины, я бы вам посоветовал в сравнении операционых систем следует продвинуться дальше, нежели сравнивать их по XP и сервис паку. Там, кстати и ссыль есть.
     
  17. Stinky

    Stinky New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2012
    Сообщения:
    18
    amvoz, не не, бред это все. Смотри как надо:

    Код (Text):
    1. format PE Console
    2. include '\fasm\include\win32ax.inc'
    3. section '.code' executable readable
    4.  
    5. struct COORD
    6.    x dw ?
    7.    y dw ?
    8. ends
    9.  
    10.  
    11. struct CONSOLEINFO
    12.    Length dd ?
    13.    ScreenBufferSize COORD
    14.    WindowSize COORD
    15.    WindowPosX dd ?
    16.    WindowPosY dd ?
    17.    FontSize COORD
    18.    FontFamily dd ?
    19.    FontWeight dd ?
    20.    FaceName du 32 dup ?
    21.    CursorSize dd ?
    22.    FullScreen dd ?
    23.    QuickEdit dd ?
    24.    AutoPosition dd ?
    25.    InsertMode dd ?
    26.    ScreenColors dw ?
    27.    PopupColors dw ?
    28.    HistoryNoDup dd ?
    29.    HistoryBufferSize dd ?
    30.    NumberOfHistoryBuffers dd ?
    31.    ColorTable00 dd ?
    32.    ColorTable01 dd ?
    33.    ColorTable02 dd ?
    34.    ColorTable03 dd ?
    35.    ColorTable04 dd ?
    36.    ColorTable05 dd ?
    37.    ColorTable06 dd ?
    38.    ColorTable07 dd ?
    39.    ColorTable08 dd ?
    40.    ColorTable09 dd ?
    41.    ColorTable10 dd ?
    42.    ColorTable11 dd ?
    43.    ColorTable12 dd ?
    44.    ColorTable13 dd ?
    45.    ColorTable14 dd ?
    46.    ColorTable15 dd ?
    47.    CodePage dd ?
    48.    Hwnd dd ?
    49.    ConsoleTitle du 256 dup ?
    50. ends
    51.  
    52.  
    53.  
    54.  
    55.  
    56. start:
    57. invoke CreateFileMapping, INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, sizeof.CONSOLEINFO, 0
    58.    mov [hMap], eax
    59.  
    60. invoke MapViewOfFile, [hMap], SECTION_ALL_ACCESS, 0, 0, 0
    61.  
    62. virtual at 0
    63.   CI CONSOLEINFO
    64. end virtual
    65.  
    66. mov [eax+CI.Length], sizeof.CONSOLEINFO
    67.  
    68. mov [eax+CI.ScreenBufferSize.x], 50
    69. mov [eax+CI.ScreenBufferSize.y], 30
    70.  
    71. mov [eax+CI.WindowSize.x], 50
    72. mov [eax+CI.WindowSize.y], 30
    73.  
    74. mov [eax+CI.FontFamily], 0x30
    75. mov [eax+CI.FontSize.x], 12
    76. mov [eax+CI.FontSize.y], 16
    77.  
    78. mov [eax+CI.CursorSize], 25
    79.  
    80. mov [eax+CI.ScreenColors], 0x7
    81.  
    82. mov [eax+CI.HistoryBufferSize], 50
    83. mov [eax+CI.NumberOfHistoryBuffers], 4
    84.  
    85. mov [eax+CI.ColorTable00], 0x00
    86. mov [eax+CI.ColorTable01], 0x800000
    87. mov [eax+CI.ColorTable02], 0x8000
    88. mov [eax+CI.ColorTable03], 0x808000
    89. mov [eax+CI.ColorTable04], 0x80
    90. mov [eax+CI.ColorTable05], 0x800080
    91. mov [eax+CI.ColorTable06], 0x8080
    92. mov [eax+CI.ColorTable07], 0xc0c0c0
    93. mov [eax+CI.ColorTable08], 0x808080
    94. mov [eax+CI.ColorTable09], 0xff0000
    95. mov [eax+CI.ColorTable10], 0xff00
    96. mov [eax+CI.ColorTable11], 0xffff00
    97. mov [eax+CI.ColorTable12], 0xff
    98. mov [eax+CI.ColorTable13], 0xff00ff
    99. mov [eax+CI.ColorTable14], 0xffff
    100. mov [eax+CI.ColorTable15], 0xffffff
    101.  
    102.  
    103.  
    104. invoke UnmapViewOfFile, eax
    105.  
    106. invoke GetConsoleWindow
    107. invoke SendMessage, eax, 0x4C9, [hMap], 0
    108. invoke CloseHandle, [hMap]
    109.  
    110.  
    111.  
    112.  
    113. invoke GetStdHandle, STD_OUTPUT_HANDLE
    114.    mov [outstd], eax
    115. invoke GetStdHandle, STD_INPUT_HANDLE
    116.    mov [instd], eax
    117.  
    118. invoke WriteConsole,[outstd], "1234567890zxcvbnmasdfghjklqwertyuiop", 36, bytes, 0
    119. invoke ReadConsole,[instd], buffer, 256, bytes, 0
    120.  
    121. invoke ExitProcess, 0
    122. .end start
    123.  
    124.  
    125.  
    126.  
    127. section '.data' data readable writable
    128.    hMap dd ?
    129.  
    130.    outstd dd ?
    131.    instd dd ?
    132.    bytes dd ?
    133.    buffer db 256 dup ?
     
  18. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Stinky, я уже спрашивал, а что такое сообщение 0x4C9?
     
  19. Stinky

    Stinky New Member

    Публикаций:
    0
    Регистрация:
    2 фев 2012
    Сообщения:
    18
    Нет такого. можешь прописать WM_USER+201
     
  20. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    640
    Нет, ну как нет, вот ты же сам написал:
    0x4C9
    ?