Exemple #1
0
        void PullScreen()
        {
            try
            {
                do
                {
                    ConsoleUtilities.CONSOLE_SCREEN_BUFFER_INFO bufferinfo;
                    if (ConsoleUtilities.GetConsoleScreenBufferInfo(consolestdout, out bufferinfo) == false)
                    {
                        Debug.WriteLine("GetConsoleScreenBufferInfo() failed");
                        Thread.Sleep(1000);
                        continue;
                    }

                    Push_Stdio_StdOut std = new Push_Stdio_StdOut();
                    std.WindowsY = (bufferinfo.srWindow.Bottom - bufferinfo.srWindow.Top) + 1;
                    std.WindowsX = (bufferinfo.srWindow.Right - bufferinfo.srWindow.Left) + 1;

                    ConsoleUtilities.SMALL_RECT r   = bufferinfo.srWindow;
                    ConsoleUtilities.COORD      csz = new ConsoleUtilities.COORD();
                    csz.X = (short)std.WindowsX;
                    csz.Y = (short)std.WindowsY;
                    ConsoleUtilities.COORD ccoord = new ConsoleUtilities.COORD();
                    ccoord.X = 0; ccoord.Y = 0;

                    ConsoleUtilities.CHAR_INFO2[] info = new ConsoleUtilities.CHAR_INFO2[csz.X * csz.Y];
                    if (ConsoleUtilities.ReadConsoleOutput(consolestdout, info, csz, ccoord, ref r) == false)
                    {
                        Debug.WriteLine("ReadConsoleOutput() failed");
                        Thread.Sleep(1000);
                        continue;
                    }

                    std.CursorX   = bufferinfo.dwCursorPosition.X - bufferinfo.srWindow.Left;
                    std.CursorY   = bufferinfo.dwCursorPosition.Y - bufferinfo.srWindow.Top;
                    std.SessionID = SessionID;
                    std.State     = PushStdoutState.OK;
                    std.Data      = info;

                    if (BufferChanged(std) == true)
                    {
                        consoleendSetResultStacked.SetResultStacked(std);
                        lastbuffer = std;
                        Thread.Sleep(10); //a trick to "skip" some pages, due some intense scrolling
                    }
                    else
                    {
                        Thread.Sleep(100); //polling principle :-(
                    }
                } while (consoleproc.HasExited == false);
            }
            catch (Exception ee)
            {
                Debug.WriteLine(ee.ToString());
            }
            try
            {
                Push_Stdio_StdOut std = new Push_Stdio_StdOut();
                std.State = PushStdoutState.End;
                consoleendSetResultStacked.SetResultStacked(std);
            }
            catch
            {
            }
        }
Exemple #2
0
        private static void ProcessConsoleData(Push_Stdio_StdOut std)
        {
            if (std.WindowsX != LastBuffer.WindowsX || std.WindowsY != LastBuffer.WindowsY)
            {
                ConsoleUtilities.CONSOLE_SCREEN_BUFFER_INFO_EX ex = new ConsoleUtilities.CONSOLE_SCREEN_BUFFER_INFO_EX();
                ex.cbSize = 96;
                res       = ConsoleUtilities.GetConsoleScreenBufferInfoEx(StdOutHandle, ref ex);
                ex.dwMaximumWindowSize.X = ex.dwSize.X = (short)std.WindowsX;
                ex.dwMaximumWindowSize.Y = ex.dwSize.Y = (short)std.WindowsY;
                ex.srWindow.Top          = ex.srWindow.Left = 0;
                ex.srWindow.Right        = (short)std.WindowsX;
                ex.srWindow.Bottom       = (short)std.WindowsY;
                res = ConsoleUtilities.SetConsoleScreenBufferInfoEx(StdOutHandle, ref ex);
            }

            if (std.CursorX != LastBuffer.CursorX || std.CursorY != LastBuffer.CursorY)
            {
                ConsoleUtilities.COORD c = new ConsoleUtilities.COORD();
                c.X = (short)std.CursorX;
                c.Y = (short)std.CursorY;
                res = ConsoleUtilities.SetConsoleCursorPosition(StdOutHandle, c);
            }

            if (std.Data == null)
            {
                std.Data = new ConsoleUtilities.CHAR_INFO2[1];
            }
            if (LastBuffer.Data == null)
            {
                LastBuffer.Data = new ConsoleUtilities.CHAR_INFO2[1];
            }

            bool DataModified = false;

            if (std.Data.Length != LastBuffer.Data.Length)
            {
                DataModified = true;
            }
            if (DataModified == false)
            {
                for (int i = 0; i < std.Data.Length; i++)
                {
                    if (LastBuffer.Data[i].b[0] != std.Data[i].b[0] ||
                        LastBuffer.Data[i].b[1] != std.Data[i].b[1] ||
                        LastBuffer.Data[i].b[2] != std.Data[i].b[2] ||
                        LastBuffer.Data[i].b[3] != std.Data[i].b[3])
                    {
                        DataModified = true;
                        break;
                    }
                }
            }

            if (DataModified == true)
            {
                ConsoleUtilities.COORD c = new ConsoleUtilities.COORD();
                c.X = (short)std.WindowsX;
                c.Y = (short)std.WindowsY;
                ConsoleUtilities.COORD p = new ConsoleUtilities.COORD();
                p.X = p.Y = 0;
                ConsoleUtilities.SMALL_RECT r = new ConsoleUtilities.SMALL_RECT();
                r.Left   = r.Top = 0;
                r.Right  = (short)std.WindowsX;
                r.Bottom = (short)std.WindowsY;
                res      = ConsoleUtilities.WriteConsoleOutput(StdOutHandle, std.Data, c, p, ref r);
            }

            LastBuffer = std;
        }