Link to home
Start Free TrialLog in
Avatar of mrcool4444
mrcool4444

asked on

Click

How do I make my program click ok on something like a message box or a form opening on another program like netzero when it says "click here to continue" or other programs and messages?
ASKER CERTIFIED SOLUTION
Avatar of mcrider
mcrider

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of mrcool4444
mrcool4444

ASKER

How would I set it to focus and would I send key 13 (enter) or what?
Here is what you want to do to set focus to a process that you didn't spawn:

------------------------------------------------------------
ADD THIS TO A MODULE:
------------------------------------------------------------
Private Const GWL_ID = (-12)
Global ProgHandle As Long

Private Const GW_HWNDNEXT = 2
Private Const GW_CHILD = 5

Declare Function SetFocusAPI Lib "user32" Alias "SetForegroundWindow" _
    (ByVal hwnd As Long) As Long
     
Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, _
    ByVal wCmd As Long) As Long
     
Private Declare Function GetWindowLW Lib "user32" Alias "GetWindowLongA" _
    (ByVal hwnd As Long, ByVal nIndex As Long) As Long
     
Private Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long

Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _
    (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
     
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
    (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

Declare Function GetDesktopWindow Lib "user32" () As Long

Declare Function GetExitCodeProcess Lib "kernel32" _
    (ByVal hProcess As Long, lpExitCode As Long) As Long

Declare Function OpenProcess Lib "kernel32" _
    (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
    ByVal dwProcessId As Long) As Long

Declare Function CloseHandle Lib "kernel32" _
    (ByVal hObject As Long) As Long

Declare Function SysSetFocus Lib "user32" Alias "SetFocus" _
    (ByVal hwnd As Long) As Long

Function IsActive(hprog) As Long
    Dim hProc, RetVal As Long
    'hProc = OpenProcess(0, False, hprog)
    hProc = OpenProcess(0, hprog, False)
    If hProc <> 0 Then GetExitCodeProcess hProc, RetVal
    IsActive = (RetVal = 259)
    CloseHandle hProc
End Function

Function FindWindowLike(hWndArray() As Variant, ByVal hWndStart As Long, WindowText As String, Classname As String, ID) As Long
    Dim hwnd As Long
    Dim r As Long
    ' Hold the level of recursion:
    Static level As Long
    ' Hold the number of matching windows:
    Static iFound As Long
    Dim sWindowText As String
    Dim sClassname As String
    Dim sID
    ' Initialize if necessary:
    If level = 0 Then
        iFound = 0
        ReDim hWndArray(0 To 0)
        If hWndStart = 0 Then hWndStart = GetDesktopWindow()
    End If
    ' Increase recursion counter:
    level = level + 1
    ' Get first child window:
    hwnd = GetWindow(hWndStart, GW_CHILD)
    Do Until hwnd = 0
        DoEvents ' Not necessary
        ' Search children by recursion:
        r = FindWindowLike(hWndArray(), hwnd, WindowText, Classname, ID)
        ' Get the window text and class name:
        sWindowText = Space(255)
        r = GetWindowText(hwnd, sWindowText, 255)
        sWindowText = Left(sWindowText, r)
        sClassname = Space(255)
        r = GetClassName(hwnd, sClassname, 255)
        sClassname = Left(sClassname, r)
        ' If window is a child get the ID:
        If GetParent(hwnd) <> 0 Then
            r = GetWindowLW(hwnd, GWL_ID)
            sID = CLng("&H" & Hex(r))
        Else
            sID = Null
        End If
        ' Check that window matches the search parameters:
        If sWindowText Like WindowText And sClassname Like Classname Then
            If IsNull(ID) Then
                ' If find a match, increment counter and
                '  add handle to array:
                iFound = iFound + 1
                ReDim Preserve hWndArray(0 To iFound)
                hWndArray(iFound) = hwnd
            ElseIf Not IsNull(sID) Then
                If CLng(sID) = CLng(ID) Then
                    ' If find a match increment counter and
                    '  add handle to array:
                    iFound = iFound + 1
                    ReDim Preserve hWndArray(0 To iFound)
                    hWndArray(iFound) = hwnd
                End If
            End If
        End If
        ' Get next child window:
        hwnd = GetWindow(hwnd, GW_HWNDNEXT)
    Loop
    ' Decrement recursion counter:
    level = level - 1
    ' Return the number of windows found:
    FindWindowLike = iFound
End Function

Function LocateWindow(Source As String) As Boolean
    Static hWnds() As Variant
    Dim RetVal As Long
    Dim AppTitle As String
     
    If FindWindowLike(hWnds(), 0, Source, "*", Null) = 1 Then
        ProgHandle = hWnds(1)
        RetVal = SetFocusAPI(ProgHandle)
        DoEvents
        LocateWindow = True
    Else
        LocateWindow = False
    End If
End Function

------------------------------------------------------------

In your program, you can then do this:

    If LocateWindow("Untitled - Notepad") = True Then
        SendKeys "This is a test", True
    Else
        'CANT FIND THE WINDOW
    End If

------------------------------------------------------------

When LocateWindow is called, you use whatever is in the title bar of the application you're trying to find.  It will set focus, and you just have to send the keys you want.


Cheers!
If you spawned the task, you can do this:

Dim ProgID
ProgID = Shell("Notepad",vbNormalFocus)
AppActivate ProgID
SendKeys "whatever you're going to send"


Cheers!
How would I send enter?
would I do sendkey keyascii 13? or what?
To click a command button, you send a space...

   SendKeys " "

You could also send an enter like this:

   SendKeys "{ENTER}"

or

   SendKeys "~"


Cheers!
Thank you, you have helped me a lot!  Just one more thing, how do you send something like alt+f of F4 or something like that?  And why does {ENTER} make it press enter, is {ENTER} a built in function in vb that means enter?  'Cause I never heard of it.
To send an ALT-F4 you would do this:

SendKeys "%{F4}"

Yes, {ENTER} is built into VB... Check out the help page for SendKeys.  It has a list of all of the special keys that can be send with SendKeys.


Cheers!