Link to home
Start Free TrialLog in
Avatar of gigglick
gigglick

asked on

VB6 Close a program

HI - I am using the below code to close and open a program.  The open portion works fine, however, the close portion is not working. TargetHwnd keeps getting a zero value.  Anyone know a better way of doing this? I am using ClickYes in order to suppress some Outlook prompts but I don't want to leave it running on the machine once the job is complete (for obvious reasons).

'API's Function Declarations

 Private Declare Function IsWindow Lib "user32" (ByVal hwnd As Long) As Long


 Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" ( _
    ByVal hwnd As Long, _
    ByVal nIndex As Long) As Long


 Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" ( _
    ByVal hwnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, _
    ByVal lParam As Long) As Long


 Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
    ByVal lpClassName As Any, _
    ByVal lpWindowName As String) As Long


 'API Constants

 Public Const GWL_STYLE = -16

 Public Const WS_DISABLED = &H8000000

 Public Const WM_CANCELMODE = &H1F

 Public Const WM_CLOSE = &H10


 Public Function IsTaskRunning(sWindowName As String) As Boolean
    Dim hwnd As Long, hWndOffline As Long
   
    On Error GoTo IsTaskRunning_Eh
    'get handle of the application
    'if handle is 0 the application is currently not running
    hwnd = FindWindow(0&, sWindowName)
    If hwnd = 0 Then
        IsTaskRunning = False
        Exit Function
    Else
        IsTaskRunning = True
    End If
   

 IsTaskRunning_Exit:
        Exit Function


 IsTaskRunning_Eh:
    Call ShowError(sWindowName, "IsTaskRunning")

 End Function


 Public Function EndTask(sWindowName As String) As Integer
    Dim X As Long, ReturnVal As Long, TargetHwnd As Long
   
    'find handle of the application
    TargetHwnd = FindWindow(0&, sWindowName)
    If TargetHwnd = 0 Then Exit Function
   
    If IsWindow(TargetHwnd) = False Then
        GoTo EndTaskFail
    Else
    'close application
        If Not (GetWindowLong(TargetHwnd, GWL_STYLE) And WS_DISABLED) Then
            X = PostMessage(TargetHwnd, WM_CLOSE, 0, 0&)
            DoEvents
        End If
    End If
   
    GoTo EndTaskSucceed


 EndTaskFail:
    ReturnVal = False
    MsgBox "EndTask: cannot terminate " & sWindowName & " task"
    GoTo EndTaskEndSub


 EndTaskSucceed:
    ReturnVal = True


 EndTaskEndSub:
    EndTask% = ReturnVal

 End Function


 Public Function ShowError(sText As String, sProcName As String)
   'this function displays an error that occurred
   
    Dim sMsg As String
    sMsg = "Error # " & Str(Err.Number) & " was generated by " _
         & Err.Source & vbCrLf & Err.Description
    MsgBox sMsg, vbCritical, sText & Space(1) & sProcName
    Exit Function


 End Function
ASKER CERTIFIED SOLUTION
Avatar of RobSampson
RobSampson
Flag of Australia image

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