Skip to Content
avatar image
Former Member

C# Iterating Controls in the GuiUserArea

I am in the process of building an application in C# winforms.

If we think along the lines of meta data, I am trying to capture as much information about the user's open sessions as I can.

I have got as far as obtaining all the session info that I require.

Now I am curious as to how much information about the visible on-screen data I can capture.
My instinctive thought was to iterate the controls and seeing if I could capture text boxes and labels.

However, I am struggling.

Looking at documentation, I see there are various 'FindBy' functions, but all of these appear to be designed to be useful only if you know the names of individual controls already.

Does anyone know how I can walk/iterate through all the controls in the user area, and capture their name/value ?

Many Thanks for any tips !


Code so far ....

class sap_helper



public  static Dictionary<string, SapInfoItem> get_sapInfo()




Dictionary<string, SapInfoItem> sapInfo = new Dictionary<string, SapInfoItem>();


GuiApplication sapGuiApp;


SapROTWr.CSapROTWrapper sapROTWrapper = new SapROTWr.CSapROTWrapper();


object SapGuilRot = sapROTWrapper.GetROTEntry("SAPGUI");


object engine = SapGuilRot.GetType().InvokeMember("GetSCriptingEngine", System.Reflection.BindingFlags.InvokeMethod,


null, SapGuilRot, null);


sapGuiApp = engine as GuiApplication;


int i = sapGuiApp.Children.Count;


if (sapGuiApp.Connections.Length > 0)




GuiConnection connection = sapGuiApp.Connections.ElementAt(0) as GuiConnection;


foreach (GuiSession child_session in connection.Children)




GuiSession session = child_session as GuiSession;   //connection.Children.ElementAt(0) as GuiSession;

// populate user defined structure


SapInfoItem sii = new SapInfoItem();  


sii.system_name = session.Info.SystemName;


sii.client = session.Info.Client;


sii.program = session.Info.Program;


sii.screen_number = session.Info.ScreenNumber;


sii.handle = session.ActiveWindow.Handle;


sii.transaction = session.Info.Transaction;

                 // add structure to dictionary collection


sapInfo.Add(sii.handle.ToString("X"), sii);




connection = null;




sapGuiApp = null;


SapGuilRot = null;


sapROTWrapper = null;


return sapInfo;






Add comment
10|10000 characters needed characters exceeded

  • Get RSS Feed

1 Answer

  • Dec 02, 2014 at 07:11 AM

    Hello Simon,

    sure, as you can see it is very easy to understand the scan process. It is a recursive call with the sub procedure GetIDs. In this sub procedure I add to outText variable the ID, Name and Text (Value) of the control.I start the scan in the main sub procedure with a collection of a session.



        Option Explicit


        Dim outText

      '-Sub GetIDs----------------------------------------------------------

        Sub GetIDs(collection)


            On Error Resume Next


            Dim i, Child

          If InStr(1, collection.Id(), "/usr/", 1) Then

            outText = outText & collection.Id() & vbCrLf

            'outText = outText & collection.Name() & vbCrLf

            'outText = outText & collection.Text() & vbCrLf

          End If

          Set Child = collection.Children()

          If IsObject(Child) Then

            If Child.Count() > 0 Then

              For i = 0 To Child.Count() - 1

                GetIDs Child.Item(CInt(i))


            End If

          End If

        End Sub

      '-Sub Main------------------------------------------------------------

        Sub Main()


            Dim SapGuiAuto, application, connection, session, i

          Set SapGuiAuto = GetObject("SAPGUI")

          If Not IsObject(SapGuiAuto) Then

            Exit Sub

          End If

          Set application = SapGuiAuto.GetScriptingEngine

          If Not IsObject(application) Then

            Exit Sub

          End If

          Set connection = application.Children(0)

          If Not IsObject(connection) Then

            Exit Sub

          End If

          Set session = connection.Children(0)

          If Not IsObject(session) Then

            Exit Sub

          End If

          For i = 0 To session.Children().Count() - 1

            GetIDs session.Children(CInt(i))


        End Sub



        MsgBox outText


    In GetIDs function I catch the GuiUserArea and work only with the controls inside it. The GUIUserArea has an ID like this - /app/con[0]/ses[0]/wnd[0]/usr/... Hope it is no problem to transfer it in C# syntax.

    Here an example from the SAP logon screen.

    Enjoy it.



    Add comment
    10|10000 characters needed characters exceeded