InfoConnect for Unisys
Log User Input

You can log user input to satisfy auditing requirements or other purposes. This sample appends all of the keys entered by a user to a log file.

Before you run the sample, make sure a session is open in InfoConnect.

To log keys entered by users

  1. In Visual Studio, create a new Console Application project and add references for the following InfoConnect assemblies. (Depending on your version of Visual Studio, these can be found either on the .NET tab or under Assemblies | Extensions.)
    Attachmate.Reflection
    Attachmate.Reflection.Framework
    Attachmate.Reflection.Emulation.IbmHosts (if you're using IBM)
    Attachmate.Reflection.Emulation.OpenSystems (if you're using UNIX or OpenVMS)
  2. Replace all the code in the Program.cs file with the following code for the terminal you are using. This code gets a handle to InfoConnect if it is running. If the type of terminal you want to monitor is selected in the workspace, it creates event handlers for two events (BeforeSendKeys and BeforeSendControlKeys). We'll add the code for these event handlers next.
    Example Title
    Copy Code
    using System;
    using System.Collections.Generic;
    using System.Text;
    using Attachmate.Reflection.UserInterface;
    using Attachmate.Reflection.Framework;
    using Attachmate.Reflection.Emulation.IbmHosts;
    using System.IO;
    namespace LogUserInput
    {
        class Program
        {
            static void Main(string[] args)
            {
                //Get the last activated instance of InfoConnect           
                Application app = MyReflection.ActiveApplication;
    
                //Make sure InfoConnect is running
                if (app != null)
                {
                    //Get the active view         
                    IFrame frame = (IFrame)app.GetObject("Frame");
                    IView view = (IView)frame.SelectedView;
    
                    //Check for an Ibm terminal
                    if (view.Control.ToString() == "Attachmate.Reflection.Emulation.IbmHosts.IbmTerminal")
                    {
                        IIbmTerminal terminal = (IIbmTerminal)view.Control;
                        IIbmScreen screen = terminal.Screen;
                        screen.BeforeSendControlKey += new BeforeSendControlKeyEventHandler(screen_BeforeSendControlKey);
                        screen.BeforeSendKeys += new BeforeSendKeysEventHandler(screen_BeforeSendKeys);
                    }
                }
                else
                {
                    Console.WriteLine("Could not find an instance of InfoConnect");
                }
                Console.ReadKey();
            }
        }
    }
    
    Example Title
    Copy Code
    using System;
    using System.Collections.Generic;
    using System.IO;
    using Attachmate.Reflection.UserInterface;
    using Attachmate.Reflection.Framework;
    using Attachmate.Reflection.Emulation.OpenSystems;
    namespace FileTransfer
    {
        class Program
        {
    
            static void Main(string[] args)
            {
                //Get the last activated instance of InfoConnect
                Application app = MyReflection.ActiveApplication;
    
                //Make sure InfoConnect is running                               
                if (app != null)
                {
                    IFrame frame = (IFrame)app.GetObject("Frame");
                    IView view = (IView)frame.SelectedView;
    
                    if (view.Control.ToString() == "Attachmate.Reflection.Emulation.OpenSystems.Terminal")
                    {
                        ITerminal terminal = (ITerminal)view.Control;
                        IScreen screen = terminal.Screen;
                        screen.KeysSent += new KeysSentEventHandler(screen_keysSent);
                        screen.ControlKeySending += new ControlKeySendingEventHandler(screen_ControlkeySending);
                    }
                }
                else
                {
                    Console.WriteLine("Cannot find an instance of InfoConnect");
                }
                Console.ReadKey();
            }
        }
    }
    
  3. Add the Screen_BeforeSendKeys event handler along with the userInput string to the Program class. As each key is entered, this event handler adds it to the userInput string, which acts as a buffer that holds the content entered for the screen. 
    Example Title
    Copy Code
       //Use a string for a buffer
            static public string userInput = " ";
            static void screen_BeforeSendKeys(object sender, BeforeSendKeysEventArgs args)
            {
                //Append each key entered on the screen to the buffer
                userInput += args.Keys;
            }
    
    Example Title
    Copy Code
            //Use a string for a buffer
            static public string userInput = " ";
    
            static void screen_keysSent(object sender, KeysSentEventArgs args)
            {
                //Append each key entered on the screen to the buffer
                userInput += args.Key;
            }
    
  4. Add the BeforeSendControlKey event handler to the Program class. When a control key is entered, this code opens a log file and appends the contents of the userInput string buffer into the file.
    Example Title
    Copy Code
          static void screen_BeforeSendControlKey(object sender, BeforeSendControlKeyEventArgs args)
            {
                IIbmScreen screen = (IIbmScreen)sender;
                string LogFile = @"C:\users\" + Environment.UserName + @"\Documents\userInputLog.txt";
    
                //If the Transmit control key is sent to change the screen, write the user input in the buffer
                //to a log file
                if (args.Key.Equals(ControlKeyCode.Transmit) == true)
                {
                    //Open a file and append the data entered on the screen
                    StreamWriter w = File.AppendText(LogFile);
                    w.WriteLine(userInput);
    
                    //Add a divider to indicate the end of the screen
                    w.WriteLine("...................................................................");
                    w.Close();
    
                    //Reset the buffer for the next screen
                    userInput = " ";
                }
    
                //for the Tab control key and other control keys, create a new line in the buffer
                else
                {
                    userInput += "\r\n";
                }
            }
    
    Example Title
    Copy Code
            static void screen_ControlkeySending(object sender, ControlKeySendingEventArgs args)
            {
                IScreen screen = (IScreen)sender;
               
               
                //Open a file and append the data entered on the screen
                string fileName = @"C:\users\" + Environment.UserName + @"\Documents\userInputLog.txt";
                StreamWriter w = File.AppendText(fileName);
                w.WriteLine(userInput);
    
                //Add a divider to indicate the end of the screen and close the file
                w.WriteLine("...................................................................");
                w.Close();
    
                //Reset for the next screen
                userInput = " ";
            }
    

 

To test this project 

  1. Open InfoConnect and then open a session document file.
  2. In Visual Studio, press F5 to run the project.
  3. Enter some data and navigate to a few different screens.
  4. Open the userInputLog.txt log file in your Documents folder and verify that the data you entered was logged in the file.

The final code in the Program.cs file is shown below: 

Log User Input
Copy Code
using System;
using System.Collections.Generic;
using System.Text;
using Attachmate.Reflection.UserInterface;
using Attachmate.Reflection.Framework;
using Attachmate.Reflection.Emulation.IbmHosts;
using System.IO;
namespace LogUserInput
{
    class Program
    {
        //Use a string for a buffer
        static public string userInput = " ";
        static void screen_BeforeSendKeys(object sender, BeforeSendKeysEventArgs args)
        {
            //Append each key entered on the screen to the buffer
            userInput += args.Keys;
        }
        static void screen_BeforeSendControlKey(object sender, BeforeSendControlKeyEventArgs args)
        {
            IIbmScreen screen = (IIbmScreen)sender;
            string LogFile = @"C:\users\" + Environment.UserName + @"\Documents\userInputLog.txt";

            //If the Transmit control key is sent to change the screen, write the user input in the buffer
            //to a log file
            if (args.Key.Equals(ControlKeyCode.Transmit) == true)
            {
                //Open a file and append the data entered on the screen
                StreamWriter w = File.AppendText(LogFile);
                w.WriteLine(userInput);

                //Add a divider to indicate the end of the screen
                w.WriteLine("...................................................................");
                w.Close();
                //Reset the buffer for the next screen
                userInput = " ";
            }
            //For the Tab control key and other control keys, create a new line in the buffer
            else
            {
                userInput += "\r\n";
            }
        }

        static void Main(string[] args)
        {
            //Get the last activated instance of InfoConnect           
            Application app = MyReflection.ActiveApplication;

            //Make sure InfoConnect is running
            if (app != null)
            {
                //Get the active view          
                IFrame frame = (IFrame)app.GetObject("Frame");
                IView view = (IView)frame.SelectedView;

                //Check for an Ibm terminal
                if (view.Control.ToString() == "Attachmate.Reflection.Emulation.IbmHosts.IbmTerminal")
                {
                    IIbmTerminal terminal = (IIbmTerminal)view.Control;
                    IIbmScreen screen = terminal.Screen;
                    screen.BeforeSendControlKey += new BeforeSendControlKeyEventHandler(screen_BeforeSendControlKey);
                    screen.BeforeSendKeys += new BeforeSendKeysEventHandler(screen_BeforeSendKeys);
                }
            }
            else
            {
                Console.WriteLine("Could not find an instance of InfoConnect");
            }
            Console.ReadKey();
        }

    }
}

 
Log user input
Copy Code
using System;
using System.Collections.Generic;
using System.IO;
using Attachmate.Reflection.UserInterface;
using Attachmate.Reflection.Framework;
using Attachmate.Reflection.Emulation.OpenSystems;
namespace FileTransfer
{
    class Program
    {
        //Use a string for a buffer
        static public string userInput = " ";

        static void screen_keysSent(object sender, KeysSentEventArgs args)
        {
            //Append each key entered on the screen to the buffer
            userInput += args.Key;
        }
        static void screen_ControlkeySending(object sender, ControlKeySendingEventArgs args)
        {
            IScreen screen = (IScreen)sender;
           
           
            //Open a file and append the data entered on the screen
            string fileName = @"C:\users\" + Environment.UserName + @"\Documents\userInputLog.txt";
            StreamWriter w = File.AppendText(fileName);
            w.WriteLine(userInput);

            //Add a divider to indicate the end of the screen and close the file
            w.WriteLine("...................................................................");
            w.Close();

            //Reset for the next screen
            userInput = " ";
        }
        static void Main(string[] args)
        {
            //Get the last activated instance of InfoConnect
            Application app = MyReflection.ActiveApplication;

            //Make sure InfoConnect is running
            if (app != null)
            {
                IFrame frame = (IFrame)app.GetObject("Frame");
                IView view = (IView)frame.SelectedView;

                if (view.Control.ToString() == "Attachmate.Reflection.Emulation.OpenSystems.Terminal")
                {
                    ITerminal terminal = (ITerminal)view.Control;
                    IScreen screen = terminal.Screen;
                    screen.KeysSent += new KeysSentEventHandler(screen_keysSent);
                    screen.ControlKeySending += new ControlKeySendingEventHandler(screen_ControlkeySending);
                }
            }
            else
            {
                Console.WriteLine("Cannot find an instance of InfoConnect");
            }
            Console.ReadKey();
        }
    }
}