Wah judulnya pake bahasa wong londo :D, 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 :
123456
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:
12345678910111213141516171819202122
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 :
1234567891011121314151617181920212223242526
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