Rabu, 04 November 2009

Melihat Prosess dengan VB 6

Aplikasi ini merupakan aplikasi yang dibuat untuk melihat apa saja prosess yang sedang berjalan di komputer kita. Dengan ini juga, kita bisa mematikan aplikasi yang tidak kita inginkan berjalan di komputer kita.

Kita bisa membuat aplikasi sederhana ini melalui Visual Basic 6, yang dimana kita hanya memasukan 1 buah form kedalam project kita. Dan satu buah ListBox dan satu buah Timer di dalam form kita.

Agak sedikit rumit script yang dibuat untuk bisa menjalankan aplikasi ini sesuai dengan yang kita inginkan. Misalnya saja, kita harus memasukan Menu Editor kedalam form. Dimana f1 sebagai File dan f2 sebagai End Process.

Bisa dibayangkan script yang akan kita buat ini, sangat memusingkan dan juga sangat susah untuk dimengerti. Mari kita mulai pembuatan script kita untuk aplikasi sederhana ini :

Di dalam form :

Private Const TH32CS_SNAPHEAPLIST = &H1
Private Const TH32CS_SNAPPROCESS = &H2
Private Const TH32CS_SNAPTHREAD = &H4
Private Const TH32CS_SNAPMODULE = &H8
Private Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or _
TH32CS_SNAPPROCESS Or _
TH32CS_SNAPTHREAD Or _
TH32CS_SNAPMODULE)
Private Const TH32CS_INHERIT = &H80000000
Private Const MAX_PATH As Integer = 260
Private Const PROCESS_QUERY_INFORMATION As Long = &H400
Private Const PROCESS_TERMINATE As Long = (&H1)

Private Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String * MAX_PATH
End Type

Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As _
Long, ByVal lProcessID As Long) As Long
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, _
uProcess As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, _
uProcess As PROCESSENTRY32) As Long
Private Declare Sub CloseHandle Lib "kernel32" (ByVal hPass As Long)
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, _
ByVal uExitCode As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As _
Long, ByVal bInheritHandle As Long, ByVal dwProcessId _
As Long) As Long
Private Declare Function GetExitCodeProcess Lib "kernel32.dll" (ByVal hProcess As _
Long, ByRef lpExitCode As Long) As Long

Dim StrFileIn As String
Dim Touch As Integer

Private Sub List1_Click()
Touch = List1.ListIndex
End Sub

Private Sub List1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Timer1.Enabled = False
If List1.ListCount <> 0 Then
If Button = 2 Then
Me.PopupMenu f1
End If
End If
End Sub

Private Sub List1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Timer1.Enabled = True
End Sub

Private Sub List1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Timer1.Enabled = True
End Sub

Private Sub List1_Scroll()
Timer1.Enabled = False
End Sub

Private Sub f2_Click()
If List1.ListCount = 0 Then Exit Sub
Terminate List1.ItemData(Touch)
List1.RemoveItem Touch
List1.Refresh
End Sub

Private Sub Form_Load()
List1.Clear
Touch = 0
Call GetProcesses
End Sub

Sub GetProcesses()
Dim hSnapShot As Long, uProcess As PROCESSENTRY32
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&)
uProcess.dwSize = Len(uProcess)
r = Process32First(hSnapShot, uProcess)
Me.AutoRedraw = True
Do While r
r = Process32Next(hSnapShot, uProcess)
List1.AddItem Left$(uProcess.szExeFile, IIf(InStr(1, uProcess.szExeFile, _
Chr$(0)) > 0, InStr(1, uProcess.szExeFile, Chr$(0)) - _
1, 0))
List1.ItemData(List1.NewIndex) = uProcess.th32ProcessID
Loop
CloseHandle hSnapShot

List1.RemoveItem (0)
List1.RemoveItem (List1.ListCount - 1)
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Timer1.Enabled = True
End Sub

Private Sub Form_Resize()
If Me.WindowState = 0 Then
Me.Height = 6270
Me.Width = 5025
End If
End Sub

Private Function Terminate(PID As Long) As Boolean
On Error Resume Next
Dim hProcess As Long
Dim lExitCode As Long

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or _
PROCESS_TERMINATE, False, PID)
MsgBox hProcess
If GetExitCodeProcess(hProcess, lExitCode) = False Then
Terminate = False
Else
If TerminateProcess(hProcess, lExitCode) = False Then
Terminate = False
Else
Terminate = True
End If
End If
End Function

Private Sub Timer1_Timer()
List1.Clear
Call GetProcesses
End Sub

Bisa kita lihat kerumitan dari script yang baru saja kita buat tadi, bagaimana ?! memusingkan bukan…. Jika kurang jelas atau mengalami kesulitan didalam script diatas, anda bisa mendownload Aplikasi program Process Viewer beserta source codenya di sini