How can I detect whether my program is already running?

Posted by Kamarudin • 2 minute read • Comments

Wah judulnya pake bahasa wong londo :grin:, ya kira-kira kalo kita artikan lebih kurang “Bagaimana cara mengecek program saya sudah jalan atau belum ?”.

Kan sangat riskan sekali kalau program kita bisa dijalankan beberapa kali dalam waktu bersamaan dan dikomputer yang sama ditambah data yang diakses kritis lagi, karena secara default program/file exe yang dihasilkan oleh vb kalau dijalankan selalu membuat instance yang baru, dan tentunya ini tergantung kasus dimana kita ingin program kita tidak boleh dijalankan lebih dari 1 kali diwaktu dan komputer yang sama.

Sebenarnya sih penyelesaiannya gampang kita cukup mengetikkan kode berikut di form utama/form yang pertama kali dijalankan/load :

Private Sub Form_Load()
    If App.PrevInstance Then
        MsgBox "Program udah dijalankan", vbExclamation, "Peringatan"
        End
    End If
End Sub

Nah bagaimana kalo kita ingin program kita langsung aktif/fokus jika sebelumnya program sudah dijalankan (ya pengennya sih mirip Winamp gitu), caranya juga gampang kita tinggal revisi kode diatas trus tambahkan sebuah module dan copy paste kode berikut:

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Any, ByVal lpWindowName As String) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hWnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function IsIconic Lib "user32" (ByVal hWnd As Long) As Long
Private Const SW_RESTORE = 9

Public Sub Main()
    Dim hWnd As Long
    Dim lres As Long

    If App.PrevInstance Then
        hWnd = FindWindow(0&, "Menu Utama")
        If hWnd <> 0 Then
            If IsIconic(hWnd) Then lres = ShowWindow(hWnd, SW_RESTORE)

            AppActivate "Menu Utama"
            Exit Sub
        End If

    Else
        frmMain.Show
    End If
End Sub

Sample diatas dengan asumsi form utama properties namenya diset = frmMain dan untuk captionnya diset = Menu Utama, selain itu Startup Object harus di set menjadi Sub Main

Tetapi cara kedua hanya bekerja dengan baik jika kita menggunakan model SDI tidak untuk MDI, karena kode diatas untuk mengecek program kita sudah dijalankan atau belum berdasarkan properties Caption form utama. Oke mari kita lihat perbedaannya.

Jadi kode kedua juga harus kita revisi lagi menjadi seperti berikut :

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Any, ByVal lpWindowName As String) As Long
Private Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Private Declare Function IsIconic Lib "user32" (ByVal hwnd 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 Const SW_RESTORE = 9

Public Sub Main()
    Dim formCaption As String * 256

    Dim hwnd        As Long
    Dim lres        As Long

    If App.PrevInstance Then
        hwnd = FindWindow("ThunderRT6MDIForm", vbNullString) 'ThunderRT6MDIForm -> nama class MDIForm di VB
        If hwnd <> 0 Then
            GetWindowText hwnd, formCaption, 256 'GetWindowText -> untuk mengambil judul/caption form
            If IsIconic(hwnd) Then lres = ShowWindow(hwnd, SW_RESTORE)

            AppActivate formCaption
        End If

    Else
        'TODO : tampilkan frmLogin atau frmUtama disini
    End If
End Sub

Selamat mencoba :blush:

Comments