VB.net Code to Programatically Populate Address Fields in UPS Worldship

This code represents a full 8 hour day of coding. I’m posting it here as a debt of gratitude to all those on the forums who have donated their time helping out people like me. If this code helps you please let me know in the comments.

Option Explicit On
Imports System.Runtime.InteropServices
Imports System.text

Public Module upscode

Dim sShipInt As IntPtr
Dim bExit As Boolean = False
Dim bSub As Boolean = False

Dim ipName, ipAddr1, ipZip, ipCity, ipState, ipState2, ipCountry, ipPhone, ipEmail As IntPtr
Dim bName, bAddr1, bZip, bCity, bState, bCountry, bPhone, bEmail As Boolean
Dim iCountryCbo As Integer
Dim iStateCbo As Integer

Private Const WM_SETTEXT As Long = &HC
Private Const CB_SETCURSEL As Long = &H14E
Private Const CB_FINDSTRING As Long = &H14C
Private Const WM_SETFOCUS As Long = &H7
Private Const SW_RESTORE As Long = 9

Private Function FindWindow( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As IntPtr
End Function

Private Function FindWindowEx(ByVal hwndParent As IntPtr, ByVal hwndChildAfter As IntPtr, _
ByVal lpszClass As String, ByVal lpszWindow As String) As IntPtr
End Function

Private Sub GetClassName(ByVal hWnd As System.IntPtr, _
ByVal lpClassName As System.Text.StringBuilder, ByVal nMaxCount As Integer)
End Sub

Private Function GetWindowTextLength(ByVal hWnd As IntPtr) As Integer
End Function

Private Function GetWindowText(ByVal hwnd As IntPtr, _
ByVal lpString As StringBuilder, _
ByVal cch As Integer) As Integer
End Function

Private Function SendMessageByString(ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, _
ByVal lParam As String) As IntPtr
End Function

' _
'Private Function SendMessage(ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, _
'                             ByVal lParam As String) As IntPtr
'End Function

Private Function SetForegroundWindow(ByVal hwnd As IntPtr) As Boolean
End Function

'  _
'Private Function SetActiveWindow(ByVal hwnd As IntPtr) As Boolean
' End Function

Private Function ShowWindow(ByVal handle As IntPtr, ByVal nCmd As Int32) As Boolean
End Function

Public Function GetChildHandle(ByVal parent As IntPtr, ByVal className As String) As IntPtr

Dim child As IntPtr = FindWindowEx(parent, IntPtr.Zero, className, Nothing)
Return child

End Function

'use spy++ to locate window names and classes: start->all programs->visual staudio 2005->visual studio tools->spy++
'windows (labels/textboxes/forms) are nested so loop through them looking for the intptr assigned to textboxes we
'want to change - these are dynamic

Public Function InsertToWorldship(ByVal sFirstName As String, ByVal sLastName As String, ByVal sAddr1 As String, _
ByVal sAddr2 As String, ByVal sCity As String, ByVal sState As String, _
ByVal sZip As String, ByVal sCountry As String, ByVal sEmail As String) As Boolean
bExit = False
bSub = False

Dim parent As IntPtr = FindWindow("UOFUPSOnlineOffice32", "UPS WorldShip")

Dim child As IntPtr = GetChildHandle(parent, "MDIClient")

If CLng(child) = 0 Then
MessageBox.Show("Could not locate UPS Worldship Process", "Exit")
Exit Function
End If

'at this point the class name becomes dynamic, so loop until finding the next known static handle ' Ship To '
RecurseWindows(CLng(child), )

bExit = False
bSub = True
RecurseWindows(CLng(sShipInt), )

If sCountry.Substring(0, 3) = "USA" Then
sCountry = "United States"
End If

ShowWindow(parent, SW_RESTORE)

SendMessageByString(ipName, WM_SETTEXT, CInt(IntPtr.Zero), sFirstName & " " & sLastName)
SendMessageByString(ipAddr1, WM_SETTEXT, CInt(IntPtr.Zero), sAddr1 & " " & sAddr2)

iCountryCbo = CInt(SendMessageByString(ipCountry, CB_FINDSTRING, -1, sCountry))
'   SetForegroundWindow(ipCountry)
SendMessageByString(ipCountry, CB_SETCURSEL, iCountryCbo, "0")
'   SetForegroundWindow(ipZip)
'   Threading.Thread.Sleep(100)
'  Threading.Thread.Sleep(100)

'  SendMessageByString(ipZip, WM_SETTEXT, IntPtr.Zero, CInt(sZip) & "-   ")
' SetActiveWindow(ipZip)
SendMessageByString(ipCity, WM_SETTEXT, CInt(IntPtr.Zero), sCity)

' SendMessageByString(ipState2, WM_SETTEXT, IntPtr.Zero, "Blah")

iStateCbo = CInt(SendMessageByString(ipState, CB_FINDSTRING, -1, sState))
SendMessageByString(ipState, CB_SETCURSEL, iStateCbo, "0")

' SendMessageByString(ipPhone, WM_SETTEXT, IntPtr.Zero, "1234567890")
SendMessageByString(ipEmail, WM_SETTEXT, CInt(IntPtr.Zero), sEmail)

End Function

Public Sub RecurseWindows(Optional ByVal Parent_hWnd As Long = 0, Optional ByVal Level As Long = 0)

If bExit = True Then
Exit Sub
End If

If CBool(Parent_hWnd) Then

Dim tLen As Long, sbWindowText As New System.Text.StringBuilder
sbWindowText.Append(Space(260)) 'MAX_PATH
tLen = GetWindowTextLength(CType(Parent_hWnd, IntPtr))
GetWindowText(CType(Parent_hWnd, IntPtr), sbWindowText, sbWindowText.Length)

If bSub = True Then

AssignIntPtr(CType(Parent_hWnd, IntPtr), sbWindowText.ToString)

End If

If bSub = False Then
If sbWindowText.ToString = "  Ship To  " Then
sShipInt = CType(Parent_hWnd, IntPtr)
bExit = True
End If
End If

End If

Dim Child_hWnd As Long
Child_hWnd = CLng(FindWindowEx(CType(Parent_hWnd, IntPtr), CType(0, IntPtr), vbNullString, vbNullString))

Do While CBool(Child_hWnd)

RecurseWindows(Child_hWnd, Level + 1)
Child_hWnd = CLng(FindWindowEx(CType(Parent_hWnd, IntPtr), CType(Child_hWnd, IntPtr), vbNullString, vbNullString))

End Sub

Private Sub AssignIntPtr(ByVal Parent_hWnd As IntPtr, ByVal Text As String)
'the text we are actually looking for here is the label that precedes the text/combobox we want to change, so
'set a flag and next time through the loop assign the intptr

If bName = True Then
ipName = Parent_hWnd
bName = False
End If

If bAddr1 = True Then
ipAddr1 = Parent_hWnd
bAddr1 = False
End If

If bZip = True Then
ipZip = Parent_hWnd
bZip = False
End If

If bCity = True Then
ipCity = Parent_hWnd
bCity = False
End If

If ipState.ToInt64 > 0 AndAlso ipState2 = IntPtr.Zero Then
ipState2 = Parent_hWnd
End If
'2nd stated text box - used if country<>USA

If bState = True Then
ipState = Parent_hWnd
bState = False
End If

If bCountry = True Then
ipCountry = Parent_hWnd
bCountry = False
End If

If bPhone = True Then
ipPhone = Parent_hWnd
bPhone = False
End If

If bEmail = True Then
ipEmail = Parent_hWnd
bEmail = False
End If

If Text.ToString = "Company or &Name:" Then
bName = True
End If

If Text.ToString = "Addre&ss 1:" Then
bAddr1 = True
End If

If Text.ToString = "Posta&l Code:" Then
bZip = True
End If

If Text.ToString = "&City or Town:" Then
bCity = True
End If

If Text.ToString = "State/Pr^&ovince/County:" Then
bState = True
End If

If Text.ToString = "Countr&y/Territory:" Then
bCountry = True
End If

If Text.ToString = "Tele&phone:" Then
bPhone = True
End If

If Text.ToString = "E-&mail Address:" Then
bEmail = True
End If

End Sub

End Module