[2 days left] What’s wrong with your cloud strategy? Learn why multicloud solutions matter with Nimble Storage.Register Now

x
?
Solved

Detect WM_CLOSE event in vb6

Posted on 2009-05-06
6
Medium Priority
?
822 Views
Last Modified: 2012-05-06
I need to know when a particular process has shut down so I can shut down my running vb6 program
0
Comment
Question by:cmrobertson
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 3
6 Comments
 
LVL 29

Expert Comment

by:nffvrxqgrcfqvvc
ID: 24322402
You can do this by using OpenProcess() API with the SYNCHRONIZE (0x00100000L) access right. After which you than create an event with CreateEvent() you can then wait on the process handle by using WaitForMultipleObjects().

If the process in question is already running before your process then the above applies. You will also need the Process ID you can either use CreateToolHelp32() to find the PID by name or FindWindow() and GetWindowThreadProcessId() to find the PID by title.

However if you  launc the application from your exe than you can use the Shell() command which will return you the process id.
0
 
LVL 7

Author Comment

by:cmrobertson
ID: 24388745
I haven't abandoned the question, sorry i got busy and havent had a chance to try this - I am going to work on it in the next day or so and wanted to leave open in case i need a follow up question
0
 
LVL 29

Expert Comment

by:nffvrxqgrcfqvvc
ID: 24391551
Sure no problem. The only question I have is how you are opening the application.

Do you want to open the application from within your program.
Are you trying to do this on a program that is already running before your program starts.

The above will help when creating an example but a couple of things have to be altered depending on which reflects how you launch the program.
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
LVL 7

Author Comment

by:cmrobertson
ID: 24391765
I more than likely will be shelling to the application from inside my vb project
0
 
LVL 29

Accepted Solution

by:
nffvrxqgrcfqvvc earned 2000 total points
ID: 24397372
Here is a small example that should help you get started.

Create a class module : Class1
Add a command button to a form.
' Class1
 
Option Explicit
 
Private Const WAIT_OBJECT_0       As Long = 0
Private Const SYNCHRONIZE         As Long = &H100000
Private Const INFINITE            As Long = &HFFFFFFFF
 
Private Const QS_HOTKEY           As Long = &H80
Private Const QS_KEY              As Long = &H1
Private Const QS_MOUSEBUTTON      As Long = &H4
Private Const QS_MOUSEMOVE        As Long = &H2
Private Const QS_PAINT            As Long = &H20
Private Const QS_POSTMESSAGE      As Long = &H8
Private Const QS_SENDMESSAGE      As Long = &H40
Private Const QS_TIMER            As Long = &H10
 
Private Const QS_ALLINPUT         As Long = (QS_SENDMESSAGE _
  Or QS_PAINT _
  Or QS_TIMER _
  Or QS_POSTMESSAGE _
  Or QS_MOUSEBUTTON _
  Or QS_MOUSEMOVE _
  Or QS_HOTKEY _
  Or QS_KEY)
 
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function MsgWaitForMultipleObjects Lib "user32" (ByVal nCount As Long, pHandles As Long, ByVal fWaitAll As Long, ByVal dwMilliseconds As Long, ByVal dwWakeMask As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
 
Public Event OnProcessStart()
Public Event OnProcessClose()
 
Public PrematureExit  As Boolean
Private hProcess      As Long
Private mPid          As Long
 
Public Property Get IsWaiting() As Boolean
 
  If hProcess <> 0 Then
    IsWaiting = True
  Else
    IsWaiting = False
  End If
  
End Property
 
Public Sub Launch(ByVal szProgram As String)
  
  ' Wait on a single process to close.
  
  Dim bWait   As Long
  
  mPid = Shell(szProgram, vbNormalFocus)
  
  RaiseEvent OnProcessStart
  
  hProcess = OpenProcess(SYNCHRONIZE, 0, mPid)
 
  Do
    bWait = MsgWaitForMultipleObjects(1, hProcess, 0, INFINITE, QS_ALLINPUT)
      If PrematureExit Then
        bWait = WAIT_OBJECT_0
      End If
    DoEvents
  Loop Until bWait = WAIT_OBJECT_0
  
  CloseHandle hProcess
  hProcess = 0
  
  If PrematureExit = False Then
    RaiseEvent OnProcessClose
  End If
  
End Sub
 
 
' Form1
 
Option Explicit
 
Dim WithEvents cProcessWait As Class1
 
Private Sub Command1_Click()
    
  If cProcessWait.IsWaiting = False Then
    cProcessWait.Launch "c:\windows\system32\calc.exe"
  Else
    Debug.Print "Already waiting...."
  End If
  
End Sub
 
Private Sub cProcessWait_OnProcessClose()
 
  Debug.Print "Process has closed : " & Time
  
End Sub
 
Private Sub cProcessWait_OnProcessStart()
  
  Debug.Print "Process launched at : " & Time
  
End Sub
 
Private Sub Form_Load()
 
  Set cProcessWait = New Class1
  
End Sub
 
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
  
  cProcessWait.PrematureExit = True
  
  Set cProcessWait = Nothing
  
End Sub

Open in new window

0
 
LVL 7

Author Closing Comment

by:cmrobertson
ID: 31578729
Excellent, exactly what I was looking for - Thanks!
0

Featured Post

VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Have you ever wanted to restrict the users input in a textbox to numbers, and while doing that make sure that they can't 'cheat' by pasting in non-numeric text? Of course you can do that with code you write yourself but it's tedious and error-prone …
You can of course define an array to hold data that is of a particular type like an array of Strings to hold customer names or an array of Doubles to hold customer sales, but what do you do if you want to coordinate that data? This article describes…
As developers, we are not limited to the functions provided by the VBA language. In addition, we can call the functions that are part of the Windows operating system. These functions are part of the Windows API (Application Programming Interface). U…
Show developers how to use a criteria form to limit the data that appears on an Access report. It is a common requirement that users can specify the criteria for a report at runtime. The easiest way to accomplish this is using a criteria form that a…
Suggested Courses

649 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question