Thứ Bảy, 19 tháng 2, 2011

Lấy tên chương trình đang chạy trong máy tính bằng VB

Khi 1 file phần mềm chạy (do yêu cầu người dùng hay do chương trình khác kích hoạt), nó được nạp vào bộ nhớ và trở thành process. Bạn có thể dùng hàm API của Windows có tên là WTSEnumerateProcesses() để thống kê tất cả các process đang chạy trên máy, mỗi process là của file khả thi nào, từ đó quyết định xử lý chúng theo yêu cầu của mình.

Sau đây chúng tôi xin giới thiệu qui trình điển hình để xây dựng ứng dụng VB 6.0 demo việc thống kê tất cả các process đang chạy và hiển thị thông tin về chúng trong một ListVew để người dùng xem:
1. Chạy VB 6.0, tạo Project ứng dụng dạng 'Standard EXE' đơn giản.
2. Chọn menu Project.Components để hiển thị cửa sổ Components, duyệt tìm vào chọn mục Microsoft Window Common Controls 6.0 rồi Ok để thêm các control trong thư viện này vào ToolBox của Project.
3. Thiết kế Form gồm 1 ListView có tên mặc định là ListView1 như hình 4.
4. Chọn menu View.Code để hiển thị cửa sổ soạn mã nguồn cho form rồi viết code cho nó như sau:

Option Explicit
'khai báo hằng và kiểu cần dùng
Private Const WTS_CURRENT_SERVER_HANDLE = 0&
Private Type WTS_PROCESS_INFO
SessionID As Long
ProcessID As Long
pProcessName As Long
pUserSid As Long
End Type
'khai báo các hàm API cần dùng
Private Declare Function WTSEnumerateProcesses Lib 'wtsapi32.dll' Alias 'WTSEnumerateProcessesA' (ByVal hServer As Long, ByVal Reserved As Long, ByVal Version As Long, ByRef ppProcessInfo As Long, ByRef pCount As Long) As Long
Private Declare Sub WTSFreeMemory Lib 'wtsapi32.dll' (ByVal pMemory As Long)
Private Declare Sub CopyMemory Lib 'kernel32' Alias 'RtlMoveMemory' (Destination As Any, Source As Any, ByVal Length As Long)
'hàm tìm chuỗi từ địa chỉ bộ nhớ xác định
Private Function GetStringFromLP(ByVal StrPtr As Long) As String
Dim b As Byte
Dim tempStr As String
Dim bufferStr As String
Dim Done As Boolean
Done = False
Do 'lấy từng byte và xử lý
CopyMemory b, ByVal StrPtr, 1
If b = 0 Then 'kết thúc chuỗi
Done = True
Else
tempStr = Chr$(b)
bufferStr = bufferStr & tempStr
StrPtr = StrPtr + 1 'tăng pointer tới byte kế
End If
Loop Until Done
GetStringFromLP = bufferStr
End Function
'thủ tục khởi động Form
Private Sub Form_Load()
ListView1.View = lvwReport
'tạo header gồm 4 cột thông tin trên ListView
ListView1.ColumnHeaders.Add 1, 'SessionID', 'Session ID'
ListView1.ColumnHeaders.Add 2, 'ProcessID', 'Process ID'
ListView1.ColumnHeaders.Add 3, 'ProcessName', 'Process Name'
ListView1.ColumnHeaders.Add 4, 'UserID', 'User ID'
'thống kê và hiển thị các process
GetWTSProcesses
End Sub
'thủ tục thống kê và hiển thị thông tin các process
Private Sub GetWTSProcesses()
'khai báo các biến cần dùng
Dim RetVal As Long
Dim Count As Long
Dim i As Integer
Dim lpBuffer As Long
Dim p As Long
Dim udtProcInfo As WTS_PROCESS_INFO
Dim itmAdd As ListItem
'xóa nội dung cũ của ListView
ListView1.ListItems.Clear
'thống kê các process
RetVal = WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, 0&, 1, lpBuffer, Count)
If RetVal = 0 Then 'nếu thất bại
MsgBox 'Error occurred calling WTSEnumerateProcesses. ' & 'Check the Platform SDK error codes in the MSDN Documentation' & ' for more information.', vbCritical, 'Error ' & Err.LastDllError
'dừng thủ tục
Exit Sub
End If
'nếu thống kê được thì lặp hiển thị từng process
p = lpBuffer
For i = 1 To Count
'copy thông tin về process i vào biến udtProcInfo
CopyMemory udtProcInfo, ByVal p, LenB(udtProcInfo)
'thêm hàng thông tin về process i vào ListView
Set itmAdd = ListView1.ListItems.Add(i, , CStr(udtProcInfo.SessionID))
itmAdd.SubItems(1) = CStr(udtProcInfo.ProcessID)
itmAdd.SubItems(2) = GetStringFromLP(udtProcInfo.pProcessName)
itmAdd.SubItems(3) = CStr(udtProcInfo.pUserSid)
'hiệu chỉnh p về vị trí miêu tả process kế tiếp
p = p + LenB(udtProcInfo)
Next i
Set itmAdd = Nothing
'giải phóng bộ nhớ
WTSFreeMemory lpBuffer
End Sub

Lưu ý tên file khả thi của process được chứa trong trường udtProcInfo.pProcessName.
5. Chọn menu Run.Start để chạy thử Form vừa xây dựng và xem danh sách các process đang chạy trên máy.

Theo pcworld

Nguồn bài viết: thanglong-aptech.com

0 nhận xét:

Đăng nhận xét