In This Topic
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
- 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)
- 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.
Get a handle to the terminal and create event handlers |
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();
}
}
}
|
Get a handle to a terminal and create event handlers |
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();
}
}
}
|
- 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.
Handle the BeforeSendKeys to append each key entered on the screen to the buffer |
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;
}
|
Handle the BeforeSendKeys to append each key entered on the screen to the buffer |
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;
}
|
- 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.
Handle the BeforeSendControlKey event to append the buffer to the log file |
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";
}
}
|
Handle the BeforeSendControlKey event to append the buffer to the log file |
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
- Open InfoConnect and then open a session document file.
- In Visual Studio, press F5 to run the project.
- Enter some data and navigate to a few different screens.
- 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();
}
}
}
|