Вот-вот. Подсмотреть, дизассемблировать, использовать абсолютно недокументированные SendMessage для консольного окна - а потом на Висте не сработает, и кто-нибудь будет волосы на попе по одному рвать с горя
Ну учитывая, что другого решения пока не найдено, то данный вариант вполне приемлем. Ну и вообще, все претензии к мелокомягким
Хм. Странно. Проверил и на вижуалке. Работает. Правд после некоторых модификаций, так как ошибки при компиляции повалились Код (Text): //--------------------------------------------------------------------------- #include <windows.h> #include <iostream> using namespace std; 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[]) { SetConsoleTitleA("testconwnd"); HANDLE FMHandle; HWND ConWnd; LPVOID MView; ConWnd = FindWindowA(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); SetConsoleOutputCP(1251); cout << "Приювет мир!" << endl; exit: cin.get(); return 0; } //--------------------------------------------------------------------------- вот скрин: Это из-за того, что не установил достаточную ширину поля с шестнадцатеричными значениями в области дампа. Я этот косяк заметил позже, так что в исходнике полный дамп.
Последний код может потому не работать, что между SetConsoleTitleA("testconwnd"); и FindWindowA(NULL, "testconwnd"); Должно пройти какое-то время, у меня тоже не работало, пока я не воткнул между ними Код (Text): Sleep (1000); А из консоли запускать, да, не пашет, надо разобраться ++++++++++++++++++++++++++++++++++++++++++++ Тот ещё интерес на самом деле, я сколько не пытался узнать, что это за сообщение 0x4C9, не смог у себя в хидерах найти. Что за сообщение такое 0x4C9?
Жалко, что нам не удалось услышать начальника транспортного цеха! А решение здесь: http://www.cyberforum.ru/cpp-beginners/thread337821.html
amvoz Ваша ссылка все о том же - SetConsoleFont. Вы прочитали советы? попробовали? я пробовал. XP SP1, SP2, SP3, и даже один сервис-пак, но у меня - и у соседа напротив. Один и тот же "номер" шрифта дает совсем разные результаты. Есть вариант: в цикле устанавливать поочередно каждый, читать свойства шрифта, пока не попадете на, скажем, 14-пиксельный. Но гарантии, что это люцида, а не растровый - все равно не получите.
Ну главное, чтобы у вас работало. А если вы захотите распространит код на другие машины, я бы вам посоветовал в сравнении операционых систем следует продвинуться дальше, нежели сравнивать их по XP и сервис паку. Там, кстати и ссыль есть.
amvoz, не не, бред это все. Смотри как надо: Код (Text): format PE Console include '\fasm\include\win32ax.inc' section '.code' executable readable struct COORD x dw ? y dw ? ends struct CONSOLEINFO Length dd ? ScreenBufferSize COORD WindowSize COORD WindowPosX dd ? WindowPosY dd ? FontSize COORD FontFamily dd ? FontWeight dd ? FaceName du 32 dup ? CursorSize dd ? FullScreen dd ? QuickEdit dd ? AutoPosition dd ? InsertMode dd ? ScreenColors dw ? PopupColors dw ? HistoryNoDup dd ? HistoryBufferSize dd ? NumberOfHistoryBuffers dd ? ColorTable00 dd ? ColorTable01 dd ? ColorTable02 dd ? ColorTable03 dd ? ColorTable04 dd ? ColorTable05 dd ? ColorTable06 dd ? ColorTable07 dd ? ColorTable08 dd ? ColorTable09 dd ? ColorTable10 dd ? ColorTable11 dd ? ColorTable12 dd ? ColorTable13 dd ? ColorTable14 dd ? ColorTable15 dd ? CodePage dd ? Hwnd dd ? ConsoleTitle du 256 dup ? ends start: invoke CreateFileMapping, INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, sizeof.CONSOLEINFO, 0 mov [hMap], eax invoke MapViewOfFile, [hMap], SECTION_ALL_ACCESS, 0, 0, 0 virtual at 0 CI CONSOLEINFO end virtual mov [eax+CI.Length], sizeof.CONSOLEINFO mov [eax+CI.ScreenBufferSize.x], 50 mov [eax+CI.ScreenBufferSize.y], 30 mov [eax+CI.WindowSize.x], 50 mov [eax+CI.WindowSize.y], 30 mov [eax+CI.FontFamily], 0x30 mov [eax+CI.FontSize.x], 12 mov [eax+CI.FontSize.y], 16 mov [eax+CI.CursorSize], 25 mov [eax+CI.ScreenColors], 0x7 mov [eax+CI.HistoryBufferSize], 50 mov [eax+CI.NumberOfHistoryBuffers], 4 mov [eax+CI.ColorTable00], 0x00 mov [eax+CI.ColorTable01], 0x800000 mov [eax+CI.ColorTable02], 0x8000 mov [eax+CI.ColorTable03], 0x808000 mov [eax+CI.ColorTable04], 0x80 mov [eax+CI.ColorTable05], 0x800080 mov [eax+CI.ColorTable06], 0x8080 mov [eax+CI.ColorTable07], 0xc0c0c0 mov [eax+CI.ColorTable08], 0x808080 mov [eax+CI.ColorTable09], 0xff0000 mov [eax+CI.ColorTable10], 0xff00 mov [eax+CI.ColorTable11], 0xffff00 mov [eax+CI.ColorTable12], 0xff mov [eax+CI.ColorTable13], 0xff00ff mov [eax+CI.ColorTable14], 0xffff mov [eax+CI.ColorTable15], 0xffffff invoke UnmapViewOfFile, eax invoke GetConsoleWindow invoke SendMessage, eax, 0x4C9, [hMap], 0 invoke CloseHandle, [hMap] invoke GetStdHandle, STD_OUTPUT_HANDLE mov [outstd], eax invoke GetStdHandle, STD_INPUT_HANDLE mov [instd], eax invoke WriteConsole,[outstd], "1234567890zxcvbnmasdfghjklqwertyuiop", 36, bytes, 0 invoke ReadConsole,[instd], buffer, 256, bytes, 0 invoke ExitProcess, 0 .end start section '.data' data readable writable hMap dd ? outstd dd ? instd dd ? bytes dd ? buffer db 256 dup ?