About   -   Contact   -   Purchase   -   Search   -   What's New

Find/Close Windows Application
This set of functions determines if a window is open and if necessary closes that window. This is useful to avoid opening multiple instances of an application, especially if the application is a hidden background operation. To achieve this function, 5 windows API calls are employed to determine all open applications, check their identity and message these applications in order to issue a closedown call if required. The code below can be copied to a module and forms a complete working unit:
   Option Explicit 
   Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
     (ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long 
   Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
     (ByVal hwnd As Long, ByVal lpString As String, _
     ByVal aint As Long) As Long 
   Declare Function GetWindow Lib "user32" _
     (ByVal hwnd As Long, ByVal wCmd As Long) As Long 
   Declare Function EnumWindows Lib "user32" _
     (ByVal wndenmprc As Long, ByVal lParam As Long) As Long 
   Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
     (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, _
     lParam As Any) As Long 

   Private Const WM_CLOSE = &H10 
   Private Const GW_HWNDFIRST = 0 
   Private Const GW_HWNDLAST = 1 
   Private Const GW_HWNDNEXT = 2 
   Private Const GW_HWNDPREV = 3 
   Private Const GW_OWNER = 4 
   Private Const GW_CHILD = 5 
   Private Const GW_MAX = 5 

   Private mstrTarget As String 
   Private mblnSuccess As Boolean 

Public Function blnFindWindow(strApplicationTitle As String) As Boolean 

   Dim hWndTmp As Long 
   Dim nRet As Integer 
   Dim TitleTmp As String 
   Dim TitlePart As String 
   Dim MyWholeTitle As String 
   Dim mCounter As Long 
   Dim hWndOver As Integer 
   Dim sClassName As String * 100 

   blnFindWindow = False 

   TitlePart = UCase$(strApplicationTitle) 

   'loop through all the open windows 
   hWndTmp = FindWindow(0&, 0&) 

   Do Until hWndTmp = 0 

      TitleTmp = Space$(256) 
      nRet = GetWindowText(hWndTmp, TitleTmp, Len(TitleTmp)) 

      If nRet Then 
         'retrieve window title 
         TitleTmp = UCase$(VBA.Left$(TitleTmp, nRet)) 
         'compare window title & strApplicationTitle 
         If InStr(TitleTmp, TitlePart) Then 
            blnFindWindow = True 
            Exit Do 
         End If 
      End If 

      hWndTmp = GetWindow(hWndTmp, GW_HWNDNEXT) 
      mCounter = mCounter + 1 


   End Function 

Public Function blnCloseWindow(strApplicationTitle As String) As Boolean 

   ' retrieve Windows list of tasks. 
   mblnSuccess = False 
   mstrTarget = strApplicationTitle 
   EnumWindows AddressOf EnumCallback, 0 
   blnCloseWindow = mblnSuccess 

End Function 

Public Function EnumCallback(ByVal app_hWnd As Long, _
  ByVal param As Long) As Long 

   Dim buf As String * 256 
   Dim title As String 
   Dim length As Long 

   ' Checks a returned task to determine if App should be closed 

   ' get window's title. 
   length = GetWindowText(app_hWnd, buf, Len(buf)) 
   title = Left$(buf, length) 

   ' determine if target window. 
   If InStr(UCase(title), UCase(mstrTarget)) <> 0 Then 
      ' Kill window. 
      SendMessage app_hWnd, WM_CLOSE, 0, 0 
      mblnSuccess = True 
   End If 

   ' continue searching. 
   EnumCallback = 1 

End Function 

The usage of these function is straight forward and fall into 2 parts: determining if a specific application is open and if necessary closing that application. The 2 function all are as follows:

   If blnFindWindow("Notepad") Then 
       If Not blnCloseWindow("Notepad") Then 
           MsgBox "Problems encountered closing Window", _
             vbInformation, "API Call" 
           Exit Sub 
       End If 
   End If

Top of Page

Legal Notice

Ken Howe 2011