Подскажите пожалуйста как поменять шрифт в консоли? Нужно с точечного шрифта переключиться на Lucida!? ОС WinXP так что SetCurrentConsoleFontEx не предлагать если нет способа ее запустить на XP
Ну обычно через GetDC получить хендл ДЦ, а потом SelectObject... Вот только вопрос, что вернет GetDC для консоли?
Не прокатит ваша затея. Консольное окно - особое, в нем куча хаков. GetDС от него вернет ноль. А шрифт устанавливается не по HDC, а сообщением WM_SETFONT. Но для консоли это скорее всего тоже не прокатит.
Код (Text): HFONT hFont; hFont = CreateFont(15, 0, 0, 0, 550, 0, 0, 0, 0, 0, 0, 0, 0, L"Lucida Console"); SendMessage((HWND)GetStdHandle(STD_OUTPUT_HANDLE), WM_SETFONT, (UINT)hFont, TRUE); Попытался сделать так, но ничего не получилось(может еще какие идеи есть?
На самом деле, это сделать почти невозможно. Есть более-менее нормальный способ - через правку реестра (выбором консольного шрифта по умолчанию - люцида), о чем и советуют. И есть неправильный способ - SetConsoleFont (недокументированная) - в принципе, если изучить все шрифты для консоли, по размеру, и найти такой вариант с люцидой, который по параметрам не имеет аналогов среди растровых, то можно, в цикле перебирая шрифты через SetConsoleFont, добраться до того, который нужен. Но это не гарантирует работу на другой системе, с другим сервис-паком, и так далее. Легче отказаться от требования "сменить шрифт в консоли", и объяснить, зачем и почему это нужно. Если речь идет о пресловутой русификации, то уже достало - CharToOem, и никому не надо ломать голову.
Если в свойствах ярлыка консольной программы можно поменять ей шрифт вручную, возможно, существует способ сделать то же самое программно. Временный ярлык это, конечно, мизерабль, но более прямого пути я не видел.
поменять нужно т.к. только люцида поддерживает одновременно и немецкий и русский языки....если кто-нить подскажет локаль кот будет поддерживать оба эти языка буду благодарен...я пока такую еще не нашел
Тоже искал решение этой проблемы. В интернетах ниче не нашел, зато пару часов в обществе оли дали некоторые плоды. Диалог настроек консольного окна реализован в system32/console.dll Вот дамп того места, где выполняется непосредственно сама настройка: Код (Text): 6EA62E4C 53 PUSH EBX 6EA62E4D 8B5C24 08 MOV EBX,DWORD PTR SS:[ESP+8] 6EA62E51 56 PUSH ESI ; USER32.LoadStringW 6EA62E52 33F6 XOR ESI,ESI 6EA62E54 39B3 C8000000 CMP DWORD PTR DS:[EBX+C8],ESI 6EA62E5A 75 04 JNZ SHORT CONSOLE.6EA62E60 6EA62E5C 33C0 XOR EAX,EAX 6EA62E5E EB 6B JMP SHORT CONSOLE.6EA62ECB 6EA62E60 55 PUSH EBP 6EA62E61 56 PUSH ESI 6EA62E62 FF33 PUSH DWORD PTR DS:[EBX] 6EA62E64 56 PUSH ESI 6EA62E65 6A 04 PUSH 4 6EA62E67 56 PUSH ESI 6EA62E68 6A FF PUSH -1 6EA62E6A FF15 7810A66E CALL DWORD PTR DS:[<&KERNEL32.CreateFileMa>; kernel32.CreateFileMappingW 6EA62E70 8BE8 MOV EBP,EAX 6EA62E72 3BEE CMP EBP,ESI 6EA62E74 75 04 JNZ SHORT CONSOLE.6EA62E7A 6EA62E76 33C0 XOR EAX,EAX 6EA62E78 EB 50 JMP SHORT CONSOLE.6EA62ECA 6EA62E7A 56 PUSH ESI 6EA62E7B 56 PUSH ESI 6EA62E7C 56 PUSH ESI 6EA62E7D 68 1F000F00 PUSH 0F001F 6EA62E82 55 PUSH EBP 6EA62E83 FF15 7410A66E CALL DWORD PTR DS:[<&KERNEL32.MapViewOfFil>; kernel32.MapViewOfFile 6EA62E89 3BC6 CMP EAX,ESI 6EA62E8B 74 34 JE SHORT CONSOLE.6EA62EC1 6EA62E8D 8B0B MOV ECX,DWORD PTR DS:[EBX] 6EA62E8F 8BD1 MOV EDX,ECX 6EA62E91 57 PUSH EDI 6EA62E92 C1E9 02 SHR ECX,2 6EA62E95 8BF8 MOV EDI,EAX 6EA62E97 8BF3 MOV ESI,EBX 6EA62E99 F3:A5 REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[> 6EA62E9B 8BCA MOV ECX,EDX 6EA62E9D 83E1 03 AND ECX,3 6EA62EA0 50 PUSH EAX 6EA62EA1 F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[ES> 6EA62EA3 FF15 6C10A66E CALL DWORD PTR DS:[<&KERNEL32.UnmapViewOfF>; kernel32.UnmapViewOfFile 6EA62EA9 6A 00 PUSH 0 6EA62EAB 55 PUSH EBP 6EA62EAC 68 C9040000 PUSH 4C9 6EA62EB1 FFB3 C8000000 PUSH DWORD PTR DS:[EBX+C8] 6EA62EB7 FF15 9C11A66E CALL DWORD PTR DS:[<&USER32.SendMessageW>] ; USER32.SendMessageW 6EA62EBD 33F6 XOR ESI,ESI 6EA62EBF 46 INC ESI 6EA62EC0 5F POP EDI 6EA62EC1 55 PUSH EBP 6EA62EC2 FF15 6810A66E CALL DWORD PTR DS:[<&KERNEL32.CloseHandle>>; kernel32.CloseHandle 6EA62EC8 8BC6 MOV EAX,ESI 6EA62ECA 5D POP EBP 6EA62ECB 5E POP ESI 6EA62ECC 5B POP EBX 6EA62ECD C2 0400 RETN 4 вольная сишная интерпритация: Код (Text): // Создаем не именованный файл отображенный в память HANDLE fmhandle = CreateFileMappingW(0xFFFFFFFF, NULL, PAGE_READWRITE, 0, 0x10C, NULL); LPVOID fmview = MapViewOfFile(fmhandle, F001F, 0, 0, 0); // Записываем туда инфу о шрифте и т.п. CopyMemory(fmview, /*Указатель на структуру с настройкам*/, 0x10C); UnmapViewOfFile(fmview); // Посылаем нашему консольному окну специальную месагу SendMessageW(conhandle, 0x4C9, fmhandle, 0); //Закроем файл CloseHandle(fmhandle); где conhandle - хэндл консольного окна, fmhandle - хэндл файла отображаемого в память, в который записана какая-то магическая структура, дамп которой выглядит следующим образом: Особый интерес представляет вызов SendMessage. А в качестве струкуры с настройкам, в отладчике подсмотрен такой вот дамп: Код (Text): 00145A70 0C 01 00 00 50 00 2C >...P., 00145A78 50 00 19 00 D4 00 00 >P..Ф... 00145A80 7B 00 00 00 00 00 0C >{....... 00145A88 36 00 00 00 90 01 00 >6...ђ.. 00145A90 4C 00 75 00 63 00 69 >L.u.c.i. 00145A98 64 00 61 00 20 00 43 >d.a. .C. 00145AA0 6F 00 6E 00 73 00 6F >o.n.s.o. 00145AA8 6C 00 65 00 00 00 00 >l.e..... 00145AB0 00 00 00 00 00 00 00 >........ 00145AB8 00 00 00 00 00 00 00 >........ 00145AC0 00 00 00 00 00 00 00 >........ 00145AC8 00 00 00 00 00 00 00 >........ 00145AD0 19 00 00 00 00 00 00 >....... 00145AD8 00 00 00 00 00 00 01 >....... 00145AE0 01 00 00 00 07 00 F5 >....х. 00145AE8 00 00 00 00 32 00 00 >....2... 00145AF0 04 00 00 00 00 00 00 >....... 00145AF8 00 00 80 00 00 80 00 >..Ђ..Ђ.. 00145B00 00 80 80 00 80 00 00 >.ЂЂ.Ђ... 00145B08 80 00 80 00 80 80 00 >Ђ.Ђ.ЂЂ.. 00145B10 C0 C0 C0 00 80 80 80 >ААА.ЂЂЂ. 00145B18 00 00 FF 00 00 FF 00 >..я..я.. 00145B20 00 FF FF 00 FF 00 00 >.яя.я... 00145B28 FF 00 FF 00 FF FF 00 >я.я.яя.. 00145B30 FF FF FF 00 62 03 00 >яяя.b.. 00145B38 DC 01 52 00 25 00 53 >ЬR.%.S. 00145B40 79 00 73 00 74 00 65 >y.s.t.e. 00145B48 6D 00 52 00 6F 00 6F >m.R.o.o. 00145B50 74 00 25 00 5C 00 73 >t.%.\.s. 00145B58 79 00 73 00 74 00 65 >y.s.t.e. 00145B60 6D 00 33 00 32 00 5C >m.3.2.\. 00145B68 63 00 6D 00 64 00 2E >c.m.d... 00145B70 65 00 78 00 65 00 00 >e.x.e... 00145B78 00 00 00 00 >.... Осталось узнать как интерпретировать байты этой структуры, чтобы можно было свободно менять шрифты, размеры и цвета... Может у кого-нить будут соображения по этому поводу?
Написал на сях. РАБОТАЕТ!!! Вот код: Код (Text): //--------------------------------------------------------------------------- #include <iostream.h> #include <windows.h> char fontdata[] = { 0x0C, 0x01, 0x00, 0x00, 0x50, 0x00, 0x2C, 0x01, 0x50, 0x00, 0x19, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x36, 0x00, 0x00, 0x00, 0x90, 0x01, 0x00, 0x00, 0x4C, 0x00, 0x75, 0x00, 0x63, 0x00, 0x69, 0x00, 0x64, 0x00, 0x61, 0x00, 0x20, 0x00, 0x43, 0x00, 0x6F, 0x00, 0x6E, 0x00, 0x73, 0x00, 0x6F, 0x00, 0x6C, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0xF5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x62, 0x03, 0x00, 0x00, 0x84, 0x01, 0x4E, 0x00, 0x25, 0x00, 0x53, 0x00, 0x79, 0x00, 0x73, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x52, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x74, 0x00, 0x25, 0x00, 0x5C, 0x00, 0x73, 0x00, 0x79, 0x00, 0x73, 0x00, 0x74, 0x00, 0x65, 0x00, 0x6D, 0x00, 0x33, 0x00, 0x32, 0x00, 0x5C, 0x00, 0x63, 0x00, 0x6D, 0x00, 0x64, 0x00, 0x2E, 0x00, 0x65, 0x00, 0x78, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; int main(int argc, char* argv[]) { SetConsoleTitle("testconwnd"); HANDLE FMHandle; HWND ConWnd; LPVOID MView; ConWnd = FindWindow(NULL, "testconwnd"); if(ConWnd == NULL){ cout << "FindWindow"; goto exit;} FMHandle = CreateFileMappingW( (HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, sizeof(fontdata), NULL); if(FMHandle == NULL) {cout << "CreateFileMappingW"; goto exit; } MView = MapViewOfFile( FMHandle, 0xF001F, 0, 0, 0); if(MView == NULL) { cout << "MapViewOfFile"; goto exit;} CopyMemory(MView, fontdata, sizeof(fontdata)); UnmapViewOfFile(MView); SendMessageW(ConWnd, 0x4C9, (unsigned)FMHandle, 0); CloseHandle(FMHandle); cout << "Hello world!" << endl; exit: cin.get(); return 0; } //--------------------------------------------------------------------------- Код выполнен средствами Borland C++ Builder 6.0
+ Чтобы вывести русские буковки нужно указать еще кодовую страницу SetConsoleOutputCP(1251) Попробовал применить указанную там струкуру. Че-то не пашет.