// 100, 100, "Dolphin Log Console" // Open console window - width and height is the size of console window // Name is the window title void ConsoleListener::Open(bool Hidden, int Width, int Height, const char *Title) { bHidden = Hidden; #ifdef _WIN32 if (!GetConsoleWindow()) { // Open the console window and create the window handle for GetStdHandle() AllocConsole(); HWND hConWnd = GetConsoleWindow(); ShowWindow(hConWnd, SW_SHOWDEFAULT); // Hide if (Hidden) ShowWindow(hConWnd, SW_HIDE); // Save the window handle that AllocConsole() created hConsole = GetStdHandle(STD_OUTPUT_HANDLE); // Set the console window title SetConsoleTitle(Title); // Set letter space LetterSpace(Width, LOG_MAX_DISPLAY_LINES); //MoveWindow(GetConsoleWindow(), 200,200, 800,800, true); } else { hConsole = GetStdHandle(STD_OUTPUT_HANDLE); } if (hTriggerEvent != NULL && hThread == NULL) { logPending = new char[LOG_PENDING_MAX]; hThread = (HANDLE)_beginthreadex(NULL, 0, &ConsoleListener::RunThread, this, 0, NULL); } #endif }
void ConsoleListener::Open() { #if defined(_WIN32) && !defined(_XBOX) && !defined(__MINGW32__) if (!GetConsoleWindow()) { // Open the console window and create the window handle for GetStdHandle() AllocConsole(); HWND hConWnd = GetConsoleWindow(); ShowWindow(hConWnd, SW_SHOWDEFAULT); // disable console close button HMENU hMenu=GetSystemMenu(hConWnd,false); EnableMenuItem(hMenu,SC_CLOSE,MF_GRAYED|MF_BYCOMMAND); // Save the window handle that AllocConsole() created hConsole = GetStdHandle(STD_OUTPUT_HANDLE); // Set console handler if(SetConsoleCtrlHandler((PHANDLER_ROUTINE)ConsoleHandler, TRUE)){OutputDebugString(L"Console handler is installed!\n");} // Set the console window title SetConsoleTitle(title_.c_str()); SetConsoleCP(CP_UTF8); // Set letter space LetterSpace(openWidth_, LOG_MAX_DISPLAY_LINES); //MoveWindow(GetConsoleWindow(), 200,200, 800,800, true); } else { hConsole = GetStdHandle(STD_OUTPUT_HANDLE); } if (hTriggerEvent != NULL && hThread == NULL) hThread = (HANDLE)_beginthreadex(NULL, 0, &ConsoleListener::RunThread, this, 0, NULL); #endif }
// 100, 100, "Dolphin Log Console" // Open console window - width and height is the size of console window // Name is the window title void ConsoleListener::Open(bool Hidden, int Width, int Height, const char *Title) { #ifdef _WIN32 if (!GetConsoleWindow()) { // Open the console window and create the window handle for GetStdHandle() AllocConsole(); // Hide if (Hidden) ShowWindow(GetConsoleWindow(), SW_HIDE); // Save the window handle that AllocConsole() created hConsole = GetStdHandle(STD_OUTPUT_HANDLE); // Set the console window title SetConsoleTitle(UTF8ToTStr(Title).c_str()); // Set letter space LetterSpace(80, 4000); //MoveWindow(GetConsoleWindow(), 200,200, 800,800, true); } else { hConsole = GetStdHandle(STD_OUTPUT_HANDLE); } #endif }
void ConsoleListener::PixelSpace(int Left, int Top, int Width, int Height, bool Resize) { #ifdef _WIN32 // Check size if (Width < 8 || Height < 12) return; bool DBef = true; bool DAft = true; std::string SLog = ""; const HWND hWnd = GetConsoleWindow(); const HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); // Get console info CONSOLE_SCREEN_BUFFER_INFO ConInfo; GetConsoleScreenBufferInfo(hConsole, &ConInfo); DWORD BufferSize = ConInfo.dwSize.X * ConInfo.dwSize.Y; // --------------------------------------------------------------------- // Save the current text // ------------------------ DWORD cCharsRead = 0; COORD coordScreen = { 0, 0 }; static const int MAX_BYTES = 1024 * 16; std::vector<std::array<CHAR, MAX_BYTES>> Str; std::vector<std::array<WORD, MAX_BYTES>> Attr; // ReadConsoleOutputAttribute seems to have a limit at this level static const int ReadBufferSize = MAX_BYTES - 32; DWORD cAttrRead = ReadBufferSize; DWORD BytesRead = 0; while (BytesRead < BufferSize) { Str.resize(Str.size() + 1); if (!ReadConsoleOutputCharacter(hConsole, Str.back().data(), ReadBufferSize, coordScreen, &cCharsRead)) SLog += StringFromFormat("WriteConsoleOutputCharacter error"); Attr.resize(Attr.size() + 1); if (!ReadConsoleOutputAttribute(hConsole, Attr.back().data(), ReadBufferSize, coordScreen, &cAttrRead)) SLog += StringFromFormat("WriteConsoleOutputAttribute error"); // Break on error if (cAttrRead == 0) break; BytesRead += cAttrRead; coordScreen = GetCoordinates(BytesRead, ConInfo.dwSize.X); } // Letter space int LWidth = (int)(floor((float)Width / 8.0f) - 1.0f); int LHeight = (int)(floor((float)Height / 12.0f) - 1.0f); int LBufWidth = LWidth + 1; int LBufHeight = (int)floor((float)BufferSize / (float)LBufWidth); // Change screen buffer size LetterSpace(LBufWidth, LBufHeight); ClearScreen(true); coordScreen.Y = 0; coordScreen.X = 0; DWORD cCharsWritten = 0; int BytesWritten = 0; DWORD cAttrWritten = 0; for (size_t i = 0; i < Attr.size(); i++) { if (!WriteConsoleOutputCharacter(hConsole, Str[i].data(), ReadBufferSize, coordScreen, &cCharsWritten)) SLog += StringFromFormat("WriteConsoleOutputCharacter error"); if (!WriteConsoleOutputAttribute(hConsole, Attr[i].data(), ReadBufferSize, coordScreen, &cAttrWritten)) SLog += StringFromFormat("WriteConsoleOutputAttribute error"); BytesWritten += cAttrWritten; coordScreen = GetCoordinates(BytesWritten, LBufWidth); } const int OldCursor = ConInfo.dwCursorPosition.Y * ConInfo.dwSize.X + ConInfo.dwCursorPosition.X; COORD Coo = GetCoordinates(OldCursor, LBufWidth); SetConsoleCursorPosition(hConsole, Coo); if (SLog.length() > 0) Log(LogTypes::LNOTICE, SLog.c_str()); // Resize the window too if (Resize) MoveWindow(GetConsoleWindow(), Left,Top, (Width + 100),Height, true); #endif }