VanDyke Software Forums

VanDyke Software Forums (
-   Scripting (
-   -   Window Focus and Clipboard (

Rhudi 07-05-2016 12:00 PM

Window Focus and Clipboard
I have a script that runs just fine (so, why am I bothering anyone?)

Here is the issue...

In the following code snippit:

    crt.Session.SetStatusText("Receiving Data...")
    crt.Screen.Send "cat " & strDevice & vbCr
    intResult = crt.Screen.WaitForStrings("configs $ ", "cat: ", 250)

    Select Case intResult
        Case 0,2 ' Timeout or error from cat command
            Exit Sub
    End Select
    crt.Screen.SendSpecial "MENU_SELECT_ALL"
    crt.Screen.SendSpecial "MENU_COPY"
    arrData = Split(crt.Clipboard.Text, vbCrLf)
    crt.Screen.Send "cd" & vbCr & _
                    "clear" & vbCr

If SecureCRT looses keyboard focus, the "Select All" and "Copy" commands break.

Also, if I have multiple tabs open in SecureCRT, the "Select / Copy" isn't getting data from the correct tab.

Here is a completely different way that doesn't exhibit that symptom:

    crt.Session.SetStatusText("Receiving Data...")
    arrData = Split(CaptureOutputOfCommand("cat " & strDevice, sProwlName & ":"), vbCrLf)

And, the Function:

Function CaptureOutputOfCommand(szCommand, szPrompt)
    crt.Screen.Send szCommand & vbCr            ' Send command to the router.
    crt.Screen.WaitForString szCommand & vbCrLf ' Wait for the Command to be echoed by router.
    CaptureOutputOfCommand = crt.Screen.ReadString(szPrompt)           
End Function

This second method seems to slow down if there is a lot of data coming in (almost as if memory is filling up).


So, my question is: Which method is best? And, in the first method, how could I avoid the "focus" issue (should I specify the tab or something)?

A coworker helped me. "crt.Window.Activate", right before the "Select/Copy".


Since this is faster, I'll go with the first way is better.

bgagnon 07-11-2016 09:32 AM

Hi Rhudi,

The technique recommended by your colleague is one way.

Many of our example scripts illustrate "tab-safe" best practices, such as:


    ' Make this script tab safe
    Dim objTab
    objTab = crt.GetScriptTab

However, in your case, since you are working with multiple tabs, you also might want to prompt to be sure the correct tab is active:


Sub Main()
        ' Ask which tab to activate, by name/title/caption
        strTabName = crt.Dialog.Prompt("What is the name of the tab you would like to activate?", "Which tab?", strTabName)
        If strTabName = "" Then Exit Do
       ' Iterate through all tabs, searching for a match on the name"
        For i = 1 To crt.GetTabCount
            Set objTab = crt.GetTab(i)
            If objTab.Caption = strTabName Then
                Exit Do
            End If
        ' Otherwise, display a message and ask for the name again.
        crt.Dialog.MessageBox("Tab named '" & strTabName & "' was not found!")
End Sub

All times are GMT -6. The time now is 06:55 PM.