Hi ,
Like how we can drag and select in putty , I am unable to capture the console screen output ( created using screen section ) using select all from the mouse click.
Please advise if any suggestions or alternative to capture the contents of screen in Visual COBOL .Net Environment ( Managed Code).
Regards,
Zoeb
You can use the standard Windows Print Screen key to copy the desktop image to the clipboard or if you use Alt-Print Screen it will copy the current active window instead. You can also use the Windows Snipping tool to mark a partial area of the screen to copy or there are countless other 3rd party tools to do the same.
Is this what you are looking for?
Hi ,
Like how we can drag and select in putty , I am unable to capture the console screen output ( created using screen section ) using select all from the mouse click.
Please advise if any suggestions or alternative to capture the contents of screen in Visual COBOL .Net Environment ( Managed Code).
Regards,
Zoeb
No , I want to capture/read the context of the screen for Automation validations.
Hi ,
Like how we can drag and select in putty , I am unable to capture the console screen output ( created using screen section ) using select all from the mouse click.
Please advise if any suggestions or alternative to capture the contents of screen in Visual COBOL .Net Environment ( Managed Code).
Regards,
Zoeb
We are trying to read the console output of the desired screen . Is there a way to read the console screen output through c# programatically .
Hi ,
Like how we can drag and select in putty , I am unable to capture the console screen output ( created using screen section ) using select all from the mouse click.
Please advise if any suggestions or alternative to capture the contents of screen in Visual COBOL .Net Environment ( Managed Code).
Regards,
Zoeb
I found one example of how to read the console buffer programmatically in C# that also appears to work for COBOL. In this example I left the C# piece in C# instead of translating it to COBOL. I believe there are other ways of doing this as well but this seemed to work OK.
COBOL Console application:
program-id. Program1 as "readconsolebuffer.Program1".
data division.
working-storage section.
01 field-1 pic x(10) value "test".
01 field-2 pic x(10) value "chris".
screen section.
01 myscreen blank screen.
05 pic x(5) value "Name:" line 5 column 1.
05 pic x(10) using field-1 line 5 column 8.
05 pic x(8) value "Company:" line 7 column 1.
05 pic x(10) using field-2 line 7 column 10.
procedure division.
display myscreen
accept myscreen
*> read 10 lines from the top of the console buffer
perform varying myline as string thru type csReadBuffer.ConsoleReader::ReadFromBuffer(0, 0, type Console::BufferWidth as binary-short, 10)
display myline
end-perform
goback.
end program Program1.
C# utility class:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace csReadBuffer
{
public class ConsoleReader
{
public static IEnumerable ReadFromBuffer(short x, short y, short width, short height)
{
IntPtr buffer = Marshal.AllocHGlobal(width * height * Marshal.SizeOf(typeof(CHAR_INFO)));
if (buffer == null)
throw new OutOfMemoryException();
try
{
COORD coord = new COORD();
SMALL_RECT rc = new SMALL_RECT();
rc.Left = x;
rc.Top = y;
rc.Right = (short)(x width - 1);
rc.Bottom = (short)(y height - 1);
COORD size = new COORD();
size.X = width;
size.Y = height;
const int STD_OUTPUT_HANDLE = -11;
if (!ReadConsoleOutput(GetStdHandle(STD_OUTPUT_HANDLE), buffer, size, coord, ref rc))
{
// 'Not enough storage is available to process this command' may be raised for buffer size > 64K (see ReadConsoleOutput doc.)
throw new Win32Exception(Marshal.GetLastWin32Error());
}
IntPtr ptr = buffer;
for (int h = 0; h < height; h )
{
StringBuilder sb = new StringBuilder();
for (int w = 0; w < width; w )
{
CHAR_INFO ci = (CHAR_INFO)Marshal.PtrToStructure(ptr, typeof(CHAR_INFO));
char[] chars = Console.OutputEncoding.GetChars(ci.charData);
sb.Append(chars[0]);
ptr = Marshal.SizeOf(typeof(CHAR_INFO));
}
yield return sb.ToString();
}
}
finally
{
Marshal.FreeHGlobal(buffer);
}
}
[StructLayout(LayoutKind.Sequential)]
private struct CHAR_INFO
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] charData;
public short attributes;
}
[StructLayout(LayoutKind.Sequential)]
private struct COORD
{
public short X;
public short Y;
}
[StructLayout(LayoutKind.Sequential)]
private struct SMALL_RECT
{
public short Left;
public short Top;
public short Right;
public short Bottom;
}
[StructLayout(LayoutKind.Sequential)]
private struct CONSOLE_SCREEN_BUFFER_INFO
{
public COORD dwSize;
public COORD dwCursorPosition;
public short wAttributes;
public SMALL_RECT srWindow;
public COORD dwMaximumWindowSize;
}
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool ReadConsoleOutput(IntPtr hConsoleOutput, IntPtr lpBuffer, COORD dwBufferSize, COORD dwBufferCoord, ref SMALL_RECT lpReadRegion);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern IntPtr GetStdHandle(int nStdHandle);
}
}