/// <summary> /// Reads the QL console window. /// </summary> private void ReadQlConsole() { var consoleWindow = QlWindowUtils.GetQuakeLiveConsoleWindow(); var cText = QlWindowUtils.GetQuakeLiveConsoleTextArea(consoleWindow, QlWindowUtils.GetQuakeLiveConsoleInputArea(consoleWindow)); if (cText != IntPtr.Zero) { while (IsReadingConsole) { var textLength = Win32Api.SendMessage(cText, Win32Api.WM_GETTEXTLENGTH, IntPtr.Zero, IntPtr.Zero); if ((textLength == 0) || (ConsoleTextProcessor.OldWholeConsoleLineLength == textLength)) { continue; } // Entire console window text var entireBuffer = new StringBuilder(textLength + 1); Win32Api.SendMessage(cText, Win32Api.WM_GETTEXT, new IntPtr(textLength + 1), entireBuffer); var received = entireBuffer.ToString(); ConsoleTextProcessor.ProcessEntireConsoleText(received, textLength); var lengthDifference = Math.Abs(textLength - _oldLength); if (received.Length > lengthDifference) { // Bounds checking int start; int length; if (_oldLength > received.Length) { start = 0; length = received.Length; } else { start = _oldLength; length = lengthDifference; } // Standardize QL's annoying string formatting var diffBuilder = new StringBuilder(received.Substring(start, length)); diffBuilder.Replace("\"\r\n\r\n", "\"\r\n"); diffBuilder.Replace("\r\n\"\r\n", "\r\n"); diffBuilder.Replace("\r\n\r\n", "\r\n"); ConsoleTextProcessor.ProcessShortConsoleLines(diffBuilder.ToString()); } // Detect when buffer is about to be full, in order to auto-clear. Win Edit // controls can have a max of 30,000 characters, see: "Limits of Edit Controls" // - http://msdn.microsoft.com/en-us/library/ms997530.aspx More info: Q3 source // (win_syscon.c), Conbuf_AppendText int begin, end; Win32Api.SendMessage(cText, Win32Api.EM_GETSEL, out begin, out end); if ((begin >= 29300) && (end >= 29300)) { Log.Write("Clearing nearly full conbuf.", _logClassType, _logPrefix); // Auto-clear QlCommands.ClearQlWinConsole(); } _oldLength = textLength; } } else { Log.WriteCritical("Unable to get necessary console handle.", _logClassType, _logPrefix); } }