Link to home
Start Free TrialLog in
Avatar of AndrewK
AndrewK

asked on

Need to determine if web browser is open...

Hi All:
I need to write an unattended app (no forms) that will reside on a user's machine. The app looks to see if a web browser is open on the user's machine. If it is, it needs to read what page or URL the browser is pointed to (it needs, therefore, to check if multiple instances of browser windows are open). If the page or URL is a specific entry, the app has to force that particular window to the top of the user's desktop - regardless of what other apps are running. I can do this if the controlling app is the one that spawned the browser window in the first place but not if it isn't. I know that this whole app sounds like an annoyance, but I merely do as I'm asked! If anyone can point me in the right direction I'd be most gratefull.

Cheers,
Andrew
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 mcrider
mcrider

By the way, the class name for Internet Explorer is "IEFrame".


Cheers!
Also, here are the 32-bit definitions and version of FindWindowLike...


Cheers!


THE CODE:


    Private Const GWL_ID = (-12)
    Global ProgHandle As Long
   
    Private Const GW_HWNDNEXT = 2
    Private Const GW_CHILD = 5
   
    Private 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
   
    Private Declare Function GetDesktopWindow Lib "user32" () As Long
   
    Private Declare Function GetExitCodeProcess Lib "kernel32" _
        (ByVal hProcess As Long, lpExitCode As Long) As Long
   
    Private Declare Function OpenProcess Lib "kernel32" _
        (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
        ByVal dwProcessId As Long) As Long
   
    Private Declare Function CloseHandle Lib "kernel32" _
        (ByVal hObject As Long) As Long
   
    Private Declare Function SysSetFocus Lib "user32" Alias "SetFocus" _
        (ByVal hwnd As Long) As Long
   
    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
Avatar of AndrewK

ASKER

Outstanding!

I must confess to having been too lazy to look in the MS KB before posting - but hey, that's what these points are for!

Many thanks for the references and the subsequent code.
Glad I could help! Thanks for the points!


Cheers!