How to prevent multiple instances of a 32-bit VB application

This article was previously published under Q185730
This article has been archived. It is offered "as is" and will no longer be updated.
SUMMARY
This article describes how to avoid loading a second instance of anapplication when the user already has one instance running. It also setsthe focus to the first instance of the Visual Basic application whenyou attempt to start a second instance of the same application.
MORE INFORMATION

Step-by-Step Example

  1. Create a new Visual Basic project.
  2. Go into Project Properties and set the Startup Object (or Startup Form in VB4) to be Sub Main.
  3. Add a Standard Module to the Project.
  4. Paste the following code into the module:
          Option Explicit      Public Const GW_HWNDPREV = 3      Declare Function OpenIcon Lib "user32" (ByVal hwnd As Long) As Long      Declare Function FindWindow Lib "user32" Alias "FindWindowA" _        (ByVal lpClassName As String, ByVal lpWindowName As String) _         As Long      Declare Function GetWindow Lib "user32" _        (ByVal hwnd As Long, ByVal wCmd As Long) As Long      Declare Function SetForegroundWindow Lib "user32" _        (ByVal hwnd As Long) As Long      Private Sub Form_Load()            If App.PrevInstance Then               ActivatePrevInstance            End If         End Sub      Sub ActivatePrevInstance()         Dim OldTitle As String         Dim PrevHndl As Long         Dim result As Long         'Save the title of the application.         OldTitle = App.Title         'Rename the title of this application so FindWindow         'will not find this application instance.         App.Title = "unwanted instance"         'Attempt to get window handle using VB4 class name.         PrevHndl = FindWindow("ThunderRTMain", OldTitle)         'Check for no success.         If PrevHndl = 0 Then            'Attempt to get window handle using VB5 class name.            PrevHndl = FindWindow("ThunderRT5Main", OldTitle)         End If         'Check if found         If PrevHndl = 0 Then         'Attempt to get window handle using VB6 class name         PrevHndl = FindWindow("ThunderRT6Main", OldTitle)         End If         'Check if found         If PrevHndl = 0 Then            'No previous instance found.            Exit Sub         End If         'Get handle to previous window.         PrevHndl = GetWindow(PrevHndl, GW_HWNDPREV)         'Restore the program.         result = OpenIcon(PrevHndl)         'Activate the application.         result = SetForegroundWindow(PrevHndl)         'End the application.         Unload Me      End Sub						
  5. Compile the project into an EXE.
  6. Exit Visual Basic.
  7. Run the executable you created.
  8. Repeat step 7.

    RESULT: The first instance of the program is given focus and the second instance is closed. If the first instance of the application was minimized, it will be restored to a normal window automatically.
REFERENCES
For more information about preventing multiple instances of a Visual Basic 4.0 16-bit application, click the following article number to view the article in the Microsoft Knowledge Base:
142937 How to prevent multiple instances of a VB application
kbSDKWin32 kbAPI kbdSupport kbdsd kbVBp400 kbVBp500 kbVBp600 kbVBp
Properties

Article ID: 185730 - Last Review: 12/05/2015 08:40:16 - Revision: 4.0

Microsoft Visual Basic 6.0 Learning Edition, Microsoft Visual Basic 6.0 Professional Edition, Microsoft Visual Basic 6.0 Enterprise Edition, Microsoft Visual Basic 5.0 Control Creation Edition, Microsoft Visual Basic 5.0 Learning Edition, Microsoft Visual Basic 5.0 Professional Edition, Microsoft Visual Basic 5.0 Enterprise Edition, Microsoft Visual Basic 4.0 Standard Edition, Microsoft Visual Basic 4.0 Professional Edition, Microsoft Visual Basic 4.0 32-Bit Enterprise Edition

  • kbnosurvey kbarchive kbhowto KB185730
Feedback